SQL сначала СЧИТАЙТЕ СЧЕТ как ИНТ, затем СУММУ СЧЕТЧИК - PullRequest
0 голосов
/ 25 марта 2020

У меня есть данные в моей SQL базе данных сервера, как показано ниже.

descr   code
11200   BM
11201   BM
11202   BM
11203   BM
11204   BM
11205   BM
11300   EN
11301   EN
11302   EN

мой запрос такой же, как и ниже

SELECT DISTINCT descr, code
    , CAST(COUNT(code) over (partition by code) as int) as codecount
FROM category 
WHERE descr IN('11200','11201','11300') AND code IN ('BM','BM','EN') 
GROUP BY descr, code 
ORDER BY descr asc, code asc

после того, как мой запрос выполнен, мои данные отображаются как ниже

descr   code    codecount
11200    BM         2
11201    BM         2                               
11300    EN         1               

Мой вопрос, могу ли я СУММАТЬ свои codecount после того, как я cast и count это? Пример, приведенный ниже

descr   code    codecount    sum
11200    BM         2         3 
11201    BM         2         3           
11300    EN         1         3    

Значение SUM рассчитывается путем суммирования столбца codecount, где codecount с тем же кодом будет выполняться только один раз, основываясь на моем вопросе, обратите внимание, что у меня есть 2 кода со значением BM и 1 код со значением EN, поэтому сумма должна равняться 3, то есть игнорировать значение, имеющее тот же код.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 25 марта 2020

На основании ваших текущих выборочных данных все, что вам нужно, это количество строк, потому что GROUP BY ничего не делает. Также ваш CAST не требуется, результат COUNT уже равен INT. Следующий запрос возвращает ожидаемые результаты:

declare @Category table ([desc] varchar(32), code varchar(32));

insert into @Category ([desc], code)
    values
    ('11200', 'BM'),
    ('11201', 'BM'),
    ('11202', 'BM'),
    ('11203', 'BM'),
    ('11204', 'BM'),
    ('11205', 'BM'),
    ('11300', 'EN'),
    ('11301', 'EN'),
    ('11302', 'EN');

SELECT [desc], code
  , COUNT(code) OVER (PARTITION BY code) as codecount
  , COUNT(code) OVER () as totalcodecount
FROM @Category 
ORDER BY [desc] asc, code asc;

Возвраты:

desc    code    codecount   totalcodecount
------------------------------------------
11200   BM      6           9
11201   BM      6           9
11202   BM      6           9
11203   BM      6           9
11204   BM      6           9
11205   BM      6           9
11300   EN      3           9
11301   EN      3           9
11302   EN      3           9

PS: это рекомендуемый способ представить вопрос в будущем с помощью операторов DDL / DML, позволяющих кому-либо копировать и вставьте и начните тестирование, не вводя все данные образца.

1 голос
/ 25 марта 2020

Не тестировалось, поскольку вы не предоставили вставки данных DDL / образца.

. Вы не можете вкладывать оконные функции, поэтому вам придется разделить их с помощью CTE:

WITH CTE AS
(
    SELECT [desc], [code]
        , COUNT(*) over (partition by [code]) as codecount
    FROM category 
    WHERE [desc] IN ('11200','11201','11300') AND [code] IN ('BM','BM','EN') 
    GROUP BY [desc], [code] 
)
SELECT *
    , SUM(codecount) OVER() AS GrandTotal
FROM CTE
ORDER BY [desc] asc, [code] asc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...