powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / нормализация данных и запросы
9 сообщений из 9, страница 1 из 1
нормализация данных и запросы
    #39765218
nosferatu86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые участники форума.

У меня небольшой квест:

1. Есть таблица , которая содержит данные: номер чека - уникален, дату - нет, сумму продажи -нет,тип операции-нет и вид операции-нет.
2. Я могу получить 3 таблицы из п.1 делая выборку по типу операции.

3. Я не могу сопоставить данные трех таблиц без дубликатов, т.к. делаю join или apply по полям, которые не являются уникальными.

Задача получить таблицу уникальных значений вида: номер чека дата, сумма - номер чека возврата, дата, сумма - номер чека прихода, дата ,сумма.

Все эти данные я извлек в три таблицы, но уникального значения для join нет, т.к. ищу я по сумме и еще 4-5 полям, которые могут тоже совпадать.

Часть своих экспериментов и структур таблиц приведу ниже:

все таблицы имеют одинаковую структуру

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SELECT TOP (1000) [Точка продаж]
      ,[Касса]
      ,[ФН №]
      ,[Тип чека]
      ,[Номер чека]
      ,[ФД №]
      ,[Дата чека]
      ,[Время чека]
      ,[Тип операции]
      ,[Сумма чека]
      ,[Наличными]
      ,[Безналичными]
      ,[Аванс]
      ,[Кредит]
      ,[Обмен]
      ,[НДС 18%]
      ,[НДС 20%]
      ,[НДС 18/118]
      ,[НДС 20/120]
      ,[НДС 10%]
      ,[НДС 10/110]
      ,[Сумма с НДС 0%]
      ,[Сумма без НДС]
      ,[Кол-во товарных позиций]
      ,[Номер смены]
      ,[Кассир]
      ,[Данные покупателя]
      ,[СНО]
      ,[F29]
      ,[F30]
  FROM [dbo].[NONDS]



последний запрос делал с outer apply, все равно получаю дубли в одной из трех колонок с чеками ( или чек с ошибкой или чек возврата или чек прихода будет повторятся)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select D.[ФД №] ,D.[Дата чека] ,D.[Тип операции] , D.[Сумма чека] , D.Наличными , D.Безналичными, 
D.Аванс , D.Кредит , D.[НДС 10%], D.[НДС 10/110], D.[НДС 18%] ,
D.[НДС 18/118], D.[НДС 20%]  , 
D.[НДС 20/120] , D.[Сумма без НДС], D.[Сумма с НДС 0%] ,
[NDSVOZVRAT].[ФД №]  ,[NDSVOZVRAT].[Тип операции], [NDSVOZVRAT].[Дата чека], [NDSVOZVRAT].[Сумма чека] , [NDSVOZVRAT].Наличными , [NDSVOZVRAT].Безналичными , 
[NDSVOZVRAT].Аванс , [NDSVOZVRAT].Кредит , [NDSVOZVRAT].[НДС 10%], [NDSVOZVRAT].[НДС 10/110] , [NDSVOZVRAT].[НДС 18%],
[NDSVOZVRAT].[НДС 18/118], [NDSVOZVRAT].[НДС 20%], 
[NDSVOZVRAT].[НДС 20/120] , [NDSVOZVRAT].[Сумма без НДС], [NDSVOZVRAT].[Сумма с НДС 0%],
M.[ФД №] ,M.[Тип операции], M.[Дата чека] , M.[Сумма чека] , M.Наличными, M.Безналичными, 
M.Аванс, M.Кредит , M.[НДС 10%], M.[НДС 10/110] , M.[НДС 18%]  ,
M.[НДС 18/118], M.[НДС 20%], 
M.[НДС 20/120] , M.[Сумма без НДС] , M.[Сумма с НДС 0%]
into newtest from NDSVOZVRAT
OUTER APPLY
    
        (SELECT TOP 1 * from NDSALL WHERE NDSALL.[Сумма чека] = dbo.NDSVOZVRAT.[Сумма чека]*(-1) AND NDSALL.Наличными = NDSVOZVRAT.Наличными*(-1) AND NDSALL.Безналичными = NDSVOZVRAT.Безналичными*(-1) AND NDSALL.Аванс = NDSVOZVRAT.Аванс*(-1) AND NDSALL.Кредит = NDSVOZVRAT.Кредит*(-1) AND NDSALL.[Сумма без НДС] = 0 AND NDSVOZVRAT.[Сумма без НДС]=0 AND NDSVOZVRAT.[Кол-во товарных позиций]=NDSALL.[Кол-во товарных позиций])
		M
OUTER APPLY
(select TOP 1 * from NONDS WHERE NDSVOZVRAT.[Сумма чека]*(-1) = dbo.NONDS.[Сумма чека] AND NDSVOZVRAT.Наличными*(-1) = NONDS.Наличными AND NDSVOZVRAT.Безналичными*(-1) = NONDS.Безналичными AND NDSVOZVRAT.Аванс*(-1) = NONDS.Аванс AND NDSVOZVRAT.Кредит*(-1) = NDSVOZVRAT.Кредит AND NDSVOZVRAT.[Сумма без НДС] = 0)
D



в конечном итоге я всегда получаю таблицу, которая содержит дубли в одной из трех колонок. Чистка с CTE не помогает

Код: sql
1.
2.
3.
4.
5.
6.
WITH cte AS (
  SELECT*, 
     row_number() OVER(PARTITION BY [ФД чека возврат] ORDER BY [ФД чека возврат]) AS [rn]
  FROM newtest
)
delete from cte WHERE [rn] > 1



Как получить только уникальные значений в ФД чеках сразу в трех столбцах?

Спасибо за помощь, я обычный сис. админ, не судите строго)
...
Рейтинг: 0 / 0
нормализация данных и запросы
    #39765222
WarAnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nosferatu86,

выполните 6 пункт рекомендаций форума, тогда может кто нибудь поможет.
я например ваш поток сознания нераспарсил.
...
Рейтинг: 0 / 0
нормализация данных и запросы
    #39765254
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
select distinct
 номер чека дата, сумма - номер чека возврата, дата, сумма - номер чека прихода, дата ,сумма.
FROM [dbo].[NONDS]



Иначе

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select 
 номер чека дата
FROM [dbo].[NONDS]
union select
  сумма - номер чека возврата
FROM [dbo].[NONDS]
union select
  дата
FROM [dbo].[NONDS]
union select
  сумма - номер чека прихода
FROM [dbo].[NONDS]
union select
  дата
FROM [dbo].[NONDS]
union select
  сумма
FROM [dbo].[NONDS]
...
Рейтинг: 0 / 0
нормализация данных и запросы
    #39765380
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nosferatu86,

предоставьте код заполнения таблиц тестовыми данными и напишите - что вы ожидаете получить из этих данных.
...
Рейтинг: 0 / 0
нормализация данных и запросы
    #39765418
nosferatu86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Три таблицы

1.NONDS
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE [dbo].[NONDS](
	[ФД №] [float] NULL,
	[Тип операции] [nvarchar](255) NULL,
	[Сумма чека] [nvarchar](255) NULL,
	[Наличными] [nvarchar](255) NULL,
	[Безналичными] [nvarchar](255) NULL,
	[Аванс] [nvarchar](255) NULL,
	[Кредит] [nvarchar](255) NULL,
	[Обмен] [nvarchar](255) NULL,
	[НДС 18%] [nvarchar](255) NULL,
	[НДС 20%] [nvarchar](255) NULL,
	[НДС 18/118] [nvarchar](255) NULL,
	[НДС 20/120] [nvarchar](255) NULL,
	[НДС 10%] [nvarchar](255) NULL,
	[НДС 10/110] [nvarchar](255) NULL,
	[Сумма с НДС 0%] [nvarchar](255) NULL,
	[Сумма без НДС] [nvarchar](255) NULL,
	[Кол-во товарных позиций] [float] NULL,
) ON [PRIMARY]
GO


2. NDSALL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE [dbo].[NDSALL](
	[ФД №] [float] NULL,
	[Тип операции] [nvarchar](255) NULL,
	[Сумма чека] [nvarchar](255) NULL,
	[Наличными] [nvarchar](255) NULL,
	[Безналичными] [nvarchar](255) NULL,
	[Аванс] [nvarchar](255) NULL,
	[Кредит] [nvarchar](255) NULL,
	[Обмен] [nvarchar](255) NULL,
	[НДС 18%] [nvarchar](255) NULL,
	[НДС 20%] [nvarchar](255) NULL,
	[НДС 18/118] [nvarchar](255) NULL,
	[НДС 20/120] [nvarchar](255) NULL,
	[НДС 10%] [nvarchar](255) NULL,
	[НДС 10/110] [nvarchar](255) NULL,
	[Сумма с НДС 0%] [nvarchar](255) NULL,
	[Сумма без НДС] [nvarchar](255) NULL,
	[Кол-во товарных позиций] [float] NULL,
) ON [PRIMARY]
GO


3. NDSVOZVRAT
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE [dbo].[NDSVOZVRAT](
	[ФД №] [float] NULL,
	[Тип операции] [nvarchar](255) NULL,
	[Сумма чека] [nvarchar](255) NULL,
	[Наличными] [nvarchar](255) NULL,
	[Безналичными] [nvarchar](255) NULL,
	[Аванс] [nvarchar](255) NULL,
	[Кредит] [nvarchar](255) NULL,
	[Обмен] [nvarchar](255) NULL,
	[НДС 18%] [nvarchar](255) NULL,
	[НДС 20%] [nvarchar](255) NULL,
	[НДС 18/118] [nvarchar](255) NULL,
	[НДС 20/120] [nvarchar](255) NULL,
	[НДС 10%] [nvarchar](255) NULL,
	[НДС 10/110] [nvarchar](255) NULL,
	[Сумма с НДС 0%] [nvarchar](255) NULL,
	[Сумма без НДС] [nvarchar](255) NULL,
	[Кол-во товарных позиций] [float] NULL,
) ON [PRIMARY]
GO



Все три таблицы имею идентичные поля
NDSALL - все продажи с различным НДС
NDSVOZVRAT - все возраты продаж с НДС
NONDS - продажа без налога НДС.

Эти три таблицы никак не связаны. Нужно выстроить цепочку связанных значений: Все данные продажи из NDSALL к ним присоединить все возрат из NDSVOZVRAT и присоединить правильную продажу без НДС из NONDS.

Join и прочие операции я делал указывая в where совпадение по сумме, виду оплаты,сумме чека и.т.д.

В итоговой таблице, после попыткой * join , * apply, * union, я получаю значения , которые всегда содержат дубли. Как мне сделать уникальными значения в итоговой таблице, если сумма не уникальная. Грубо на сумму 4000 и вид оплаты безнал из таблицы NDSALL подходит 450 чеков возврата из NDSVOZVRAT и 30 чеков продаж NONDS. я всегда получаю дубли и могу сделать уникальными значения только по одной колонке.

Эти таблицы нужно объединить по сумме, но каждая строка с чеком должна быть уникальна, т.е. в итоговом наборе данных не должно быть дублей по номеру чека ( это [ФД №] ) , т.к. каждая цепочка продажа с "ндс, возрат с ндс, продажа без ндс" + все реквизиты из таблиц ..

Во вложении тестовые данные ко всем таблицам xls . 10 строк. ДУбли я там уже создал для чеков.
...
Рейтинг: 0 / 0
нормализация данных и запросы
    #39765444
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nosferatu86,

Как получить желаемое в подобной структуре нужно узнавать у того, кто ее придумал.
А пока будете этого персонажа отлавливать, можете поизвращаться примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
select
 ...
from
 dbo.NDSALL outer apply
 (select top (1) ... from NONDS where [ФД №] > a.[ФД №] and ... order by [ФД №]) b outer apply
 (select top (1) ... from NDSVOZVRAT where [ФД №] > a.[ФД №] and ... order by [ФД №]) c

Само-собой, достоверность результата может быть никакая...
...
Рейтинг: 0 / 0
нормализация данных и запросы
    #39765573
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nosferatu861. Есть таблица , которая содержит данные: номер чека - уникален, дату - нет, сумму продажи -нет,тип операции-нет и вид операции-нет.
2. Я могу получить 3 таблицы из п.1 делая выборку по типу операции.

...

Все эти данные я извлек в три таблицы, но уникального значения для join нет, т.к. ищу я по сумме и еще 4-5 полям, которые могут тоже совпадать.

...

Грубо на сумму 4000 и вид оплаты безнал из таблицы NDSALL подходит 450 чеков возврата из NDSVOZVRAT и 30 чеков продаж NONDS.
... и наоборот.

У вас есть множество сущностей - продаж (чеков) с атрибутами.
Вы разделяете это множество горизонтально по одному атрибуту на три подмножества.
Потом вы пытаетесь эти подмножества объединить вертикально.
Вы объединяете множества по атрибуту "сумма".
Что же вы получаете в качестве результирующего множества? (Даже если вы накладываете условие уникальности) Вы получаете случайную продажу соединенную с такой же случайной продажей. Из таблицы сущностей продажа вы делаете объединенную таблицу сущностей продажапродажа .

Это действительно та задача, которую вы пытаетесь решить? Объединить одни продажи с другими по случайному признаку?
...
Рейтинг: 0 / 0
нормализация данных и запросы
    #39765809
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор хочет определить - какие возвраты соответствовали каким продажам.
...
Рейтинг: 0 / 0
нормализация данных и запросы
    #39769158
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовАвтор хочет определить - какие возвраты соответствовали каким продажам.
Мартышкин труд, если честно.
Возврат может быть частичным, и привязка ну сумму вообще не поможет.

Как правильно сказал invm, искать архитектора... и пинать его ногами, пока тот не поумнеет.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / нормализация данных и запросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]