Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 нормализация данных и запросы  [new]
nosferatu86
Member

Откуда:
Сообщений: 2
Добрый день, уважаемые участники форума.

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

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

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

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

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

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

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

SELECT TOP (1000) [Точка продаж]
      ,[Касса]
      ,[ФН №]
      ,[Тип чека]
      ,[Номер чека]
      ,[ФД №]
      ,[Дата чека]
      ,[Время чека]
      ,[Тип операции]
      ,[Сумма чека]
      ,[Наличными]
      ,[Безналичными]
      ,[Аванс]
      ,[Кредит]
      ,[Обмен]
      ,[НДС 18%]
      ,[НДС 20%]
      ,[НДС 18/118]
      ,[НДС 20/120]
      ,[НДС 10%]
      ,[НДС 10/110]
      ,[Сумма с НДС 0%]
      ,[Сумма без НДС]
      ,[Кол-во товарных позиций]
      ,[Номер смены]
      ,[Кассир]
      ,[Данные покупателя]
      ,[СНО]
      ,[F29]
      ,[F30]
  FROM [dbo].[NONDS]


последний запрос делал с outer apply, все равно получаю дубли в одной из трех колонок с чеками ( или чек с ошибкой или чек возврата или чек прихода будет повторятся)
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 не помогает

WITH cte AS (
  SELECT*, 
     row_number() OVER(PARTITION BY [ФД чека возврат] ORDER BY [ФД чека возврат]) AS [rn]
  FROM newtest
)
delete from cte WHERE [rn] > 1


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

Спасибо за помощь, я обычный сис. админ, не судите строго)
26 янв 19, 12:02    [21794736]     Ответить | Цитировать Сообщить модератору
 Re: нормализация данных и запросы  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2382
nosferatu86,

выполните 6 пункт рекомендаций форума, тогда может кто нибудь поможет.
я например ваш поток сознания нераспарсил.
26 янв 19, 12:25    [21794743]     Ответить | Цитировать Сообщить модератору
 Re: нормализация данных и запросы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35965
select distinct
 номер чека дата, сумма - номер чека возврата, дата, сумма - номер чека прихода, дата ,сумма.
FROM [dbo].[NONDS]


Иначе

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]
26 янв 19, 13:59    [21794783]     Ответить | Цитировать Сообщить модератору
 Re: нормализация данных и запросы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6188
nosferatu86,

предоставьте код заполнения таблиц тестовыми данными и напишите - что вы ожидаете получить из этих данных.
26 янв 19, 21:41    [21794976]     Ответить | Цитировать Сообщить модератору
 Re: нормализация данных и запросы  [new]
nosferatu86
Member

Откуда:
Сообщений: 2
Три таблицы

1.NONDS
+
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
+
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
+
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 строк. ДУбли я там уже создал для чеков.

К сообщению приложен файл (demo.xls - 50Kb) cкачать
27 янв 19, 01:44    [21795059]     Ответить | Цитировать Сообщить модератору
 Re: нормализация данных и запросы  [new]
invm
Member

Откуда: Москва
Сообщений: 8379
nosferatu86,

Как получить желаемое в подобной структуре нужно узнавать у того, кто ее придумал.
А пока будете этого персонажа отлавливать, можете поизвращаться примерно так:
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
Само-собой, достоверность результата может быть никакая...
27 янв 19, 10:14    [21795103]     Ответить | Цитировать Сообщить модератору
 Re: нормализация данных и запросы  [new]
PizzaPizza
Member

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

...

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

...

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

... и наоборот.

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

Это действительно та задача, которую вы пытаетесь решить? Объединить одни продажи с другими по случайному признаку?
27 янв 19, 20:16    [21795327]     Ответить | Цитировать Сообщить модератору
 Re: нормализация данных и запросы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6188
Автор хочет определить - какие возвраты соответствовали каким продажам.
28 янв 19, 12:44    [21795686]     Ответить | Цитировать Сообщить модератору
 Re: нормализация данных и запросы  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 828
Владислав Колосов
Автор хочет определить - какие возвраты соответствовали каким продажам.

Мартышкин труд, если честно.
Возврат может быть частичным, и привязка ну сумму вообще не поможет.

Как правильно сказал invm, искать архитектора... и пинать его ногами, пока тот не поумнеет.
4 фев 19, 12:38    [21801183]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить