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

Откуда:
Сообщений: 146
У меня есть таблицы, и я должен синхронизировать их по количеству групп.
т.е.

[spoiler Заголовок
SELECT TOP  [Dt]
      ,[CustomerName]
      ,[ItemRelation]
      ,[ProductName]
      ,[ReturnCount]
      ,[DocumentNum]
      ,[DocumentDate]
      ,[IsPromo]
      ,[CustomerType]
      ,[CalendarYear]
  FROM [Action].[dbo].[promo_return]

чтобы получить уникальные группы, я делаю так

  SELECT [CustomerName]
      ,[ItemRelation]
      ,[DocumentNum]
      ,[CalendarYear]
      ,[CustomerType]
      ,Count(*) as cnt
  FROM [Action].[dbo].[promo_return]

GROUP BY
      [CustomerName]
      ,[ItemRelation]
      ,[DocumentNum]
      ,[CalendarYear]
      ,[CustomerType]
====

следующая таблица

SELECT  [CustomerName]
      ,[ItemRelation]
      ,[DocumentNum]
      ,[CalendarYear]
      ,[CustomerType]
      ,[k]
      ,[m0]
      ,[x]
      ,[coef]
      ,[ActionEffect]
      ,[ActionSales]
      ,[SalesBefore]
  FROM [Action].[dbo].[promo_effect1]

количество также считаем

Count(*) as cnt and GROUP BY

===
следующая таблица

SELECT  [ItemRelation]
      ,[DocumentNum]
      ,[CalendarYear]
      ,[CustomerName]
      ,[CustomerType]
      ,[Return]
  FROM [Action].[dbo].[returneff]

количество рассчитывается

 Count(*) as cnt and GROUP BY

и последняя таблица
SELECT [Dt]
      ,[CustomerName]
      ,[ItemRelation]
      ,[ProductName]
      ,[SaleCount]
      ,[DocumentNum]
      ,[DocumentDate]
      ,[IsPromo]
      ,[CustomerType]
      ,[CalendarYear]
  FROM [Action].[dbo].[promo_data]
количество групп расчитывается таким же образом

 Count(*) as cnt and GROUP BY

  SELECT [CustomerName]
      ,[ItemRelation]
      ,[DocumentNum]
      ,[CalendarYear]
      ,[CustomerType]
      ,Count(*) as cnt
  FROM [Action].[dbo].[promo_data]
GROUP BY
      [CustomerName]
      ,[ItemRelation]
      ,[DocumentNum]
      ,[CalendarYear]
      ,[CustomerType]
все эти таблицы должны иметь одинаковое число групп

[CustomerName]+[ItemRelation]+[DocumentNum]+[CalendarYear]+[CustomerType]
[/spoiler]



предположим, число уникальных групп = 9658 во всех этих таблицах.

Как сделать, чтобы все таблицы были перепроверены друг с другом на количество уникальных групп?

и если между одной или всеми таблицами существует различное количество уникальных групп, тогда должно быть окно с предупреждением

что таблицы отличаются от уникальной группы.

я решил пойти легким путем

; with cte1 as
(
  SELECT [CustomerName],[ItemRelation],[DocumentNum],[CalendarYear],[CustomerType],Count(*) as cnt
  FROM [Action].[dbo].[promo_return]
  GROUP BY [CustomerName],[ItemRelation],[DocumentNum],[CalendarYear],[CustomerType]
) ,
cte2 as 
(
  SELECT  [CustomerName],[ItemRelation],[DocumentNum],[CalendarYear],[CustomerType],Count(*) as cnt
  FROM [Action].[dbo].[promo_effect1]
  GROUP BY[CustomerName],[ItemRelation],[DocumentNum],[CalendarYear],[CustomerType]
) ,
cte3 as 
(
  SELECT  [CustomerName],[ItemRelation],[DocumentNum],[CalendarYear],[CustomerType],Count(*) as cnt
  FROM [Action].[dbo].[returneff]
  GROUP BY[CustomerName],[ItemRelation],[DocumentNum],[CalendarYear],[CustomerType]
),
cte4 as 
(
  SELECT  [CustomerName],[ItemRelation],[DocumentNum],[CalendarYear],[CustomerType],Count(*) as cnt
  FROM [Action].[dbo].[promo_data]
  GROUP BY[CustomerName],[ItemRelation],[DocumentNum],[CalendarYear],[CustomerType]
)
select a.[CustomerName],a.[ItemRelation],a.[DocumentNum],a.[CalendarYear],a.[CustomerType],
case when a.cnt=b.cnt and a.cnt=c.cnt and a.cnt=d.cnt then  'tables have the same  of unique group'
else 'tables have different of unique group' end 
from cte1 a 
join cte2 b on a.[CustomerName]=b.[CustomerName] and a.[ItemRelation]=b.[ItemRelation] and a.[DocumentNum]=b.[DocumentNum] and a.[CalendarYear]=b.[CalendarYear] and a.[CustomerType]=b.[CustomerType]
join cte3 c on a.[CustomerName]=c.[CustomerName] and a.[ItemRelation]=c.[ItemRelation] and a.[DocumentNum]=c.[DocumentNum] and a.[CalendarYear]=c.[CalendarYear] and a.[CustomerType]=c.[CustomerType]
join cte4 d on a.[CustomerName]=d.[CustomerName] and a.[ItemRelation]=d.[ItemRelation] and a.[DocumentNum]=d.[DocumentNum] and a.[CalendarYear]=d.[CalendarYear] and a.[CustomerType]=d.[CustomerType]


по идеи мне должно вернуться 9658 групп, но
1. мне возвращается 3414
2. все помечены как tables have different of unique group чего не может быть по определению
там точно одинаковое количество групп, ручная проверка.
Более того
не может быть, чтобы было везде 9658 групп, но разных
например в одной таблице 9658 групп и есть группа
1+2+4+5+6
в другой тоже, но там
2+3+4+8+9, но нет 1+2+4+5+6
Количество везде одинаковое и название групп тоже везде одно и тоже

Как мне правильно составить запрос для проверки одинаковости количества групп в этих табличках?
29 сен 18, 14:40    [21689873]     Ответить | Цитировать Сообщить модератору
 Re: межгрупповая проверка количества уникальных групп в sql  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
Kontox
SELECT TOP  [Dt]
      ,[CustomerName]
      ,[ItemRelation]
      ,[ProductName]
      ,[ReturnCount]
      ,[DocumentNum]
      ,[DocumentDate]
      ,[IsPromo]
      ,[CustomerType]
      ,[CalendarYear]
  FROM [Action].[dbo].[promo_return]

чтобы получить уникальные группы, я делаю так

  SELECT [CustomerName]
      ,[ItemRelation]
      ,[DocumentNum]
      ,[CalendarYear]
      ,[CustomerType]
      ,Count(*) as cnt
  FROM [Action].[dbo].[promo_return]

Не понимаю ваших терминов. Что такое "группы"?

Вторым запросом вы получаете количество записей для каждого кастомера (скажем, количество документов, или продуктов, или ещё чего то, что записывается в эту таблицу)

Для других таблиц вы тоже получаете количество записей для каждого кастомера (но записи там другие, ведь таблицы-то разные)

Итоговый запрос показывает, разное или одинаковое, количество записей для каждого кастомера в этих таблицах.
Kontox
по идеи мне должно вернуться 9658 групп, но
Эээ, вы имеете в виду, запрос должен вернуть 9658 записей?

Ну, в первой таблице 9658 кастомеров, во второй ещё сколько то.

Ваш запрос возвращает столько записей, сколько одинаковых кастомеров во всех этих таблицах.
30 сен 18, 00:19    [21690168]     Ответить | Цитировать Сообщить модератору
 Re: межгрупповая проверка количества уникальных групп в sql  [new]
Kontox
Member

Откуда:
Сообщений: 146
SELECT TOP  [Dt]
      ,[CustomerName]
      ,[ItemRelation]
      ,[ProductName]
      ,[ReturnCount]
      ,[DocumentNum]
      ,[DocumentDate]
      ,[IsPromo]
      ,[CustomerType]
      ,[CalendarYear]
  FROM [Action].[dbo].[promo_return]
тут  655002 записи

чтобы получить уникальные группы, я делаю так

  SELECT [CustomerName]
      ,[ItemRelation]
      ,[DocumentNum]
      ,[CalendarYear]
      ,[CustomerType]
      ,Count(*) as cnt
  FROM [Action].[dbo].[promo_return]

тут
вот пример групп, уникальных


во всех таблицах этот дистинк групп SELECT [CustomerName]
,[ItemRelation]
,[DocumentNum]
,[CalendarYear]
,[CustomerType]
,Count(*) as cnt

одинаковый

но почему возвращается3414 записи


В идеале я хочу такой формат вывода

К сообщению приложен файл. Размер - 93Kb
30 сен 18, 13:31    [21690358]     Ответить | Цитировать Сообщить модератору
 Re: межгрупповая проверка количества уникальных групп в sql  [new]
Kontox
Member

Откуда:
Сообщений: 146
в идеале я жду такой формат. Как его добиться ?

К сообщению приложен файл. Размер - 85Kb
30 сен 18, 13:32    [21690359]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить