SQL: как суммировать значения в категории в ssms - PullRequest
0 голосов
/ 12 июня 2018

Как суммировать значения в категории в ssms?

SELECT
,[CustomerName]
,[ItemRelation]
,[SaleCount]
,[DocumentNum]
,[DocumentYear]
,[IsPromo]

FROM mytable

Поля

,[CustomerName
,[ItemRelation]
,[DocumentNum]
,[DocumentYear]

являются стратифицированными категориями, например, "the shop of horns and hoofs" - "111" - "37" - "2018year".[SaleCount] количество продаж.В чем сложность.Для каждого такого слоя есть данные о запасе [IsPromo] (0 - нет запаса, 1 - запас), урезанный образец данных, просто пример

[ItemRelation]  [SaleCount] IsPromo ,[DocumentNum]  [DocumentYear]
11202        8,85947691     0      137                   2018
11202   9,450108704 0   137 2018
11202   12,40326767 1   137 2018
11202   25,98779894 1   137 2018
11202   63,19760196 1   137 2018
11203   8,85947691  0   138 2018
11203   9,450108704 0   138 2018
11203   12,40326767 1   138 2018

, мы видим, что для слоя

[ItemRelation], [DocumentNum] [DocumentYear]
11202              137              2018

3 единицы и два нуля по ispromo

и по слою

[ItemRelation], [DocumentNum] [DocumentYear]
11203            138            2018

здесь 2 единицы и один ноль

Как мне написать запрос, которыйвозвращает только те "слои", в которых ones для испромо встречаются от 2 до 4 раз включительно?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы можете попробовать что-нибудь из строк:

select [ItemRelation] , [SaleCount],[DocumentNum]  [DocumentYear]
from mytable
group by IsPromo
having IsPromo = 1 and count(IsPromo)>=2 and count(IsPromo)>=4
0 голосов
/ 12 июня 2018

Мы можем вернуть все совпадающие записи каждой страты, суммируя IsPromo по каждой страте, а затем сохраняя только записи, имеющие сумму от 2 до 4 включительно.

SELECT [ItemRelation], [DocumentNum], [DocumentYear]  -- and maybe other columns
FROM
(
    SELECT *,
        SUM(CAST(IsPromo AS INT)) OVER (PARTITION BY ItemRelation, DocumentNum,
            DocumentYear) promo_sum
    FROM mytable
) t
WHERE t.promo_sum BETWEEN 2 AND 4;

Примечание: Если вы действительно хотите увидетькаждая соответствующая страта только один раз, тогда мы могли бы вместо этого использовать запрос GROUP BY.Но вы все равно можете легко изменить приведенный выше запрос на SELECT DISTINCT, чтобы получить этот результат.

...