Как добавить группу по предложениям на основе разных условий? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть такая база данных: Первый столбец - название города. A, B и C - столбцы с двоичными данными 1 для да и 0 для нет.

(Имя базы данных - D1)

City         A              B              C
----    ------------    -----------    --------
Boston      1               1              1
Chicago     1               0              0
Boston      1               0              0
Boston      1               1              0
Chicago     1               1              0

Я хочу сгруппировать эти города, и у меня есть столбцы с подсчетом единиц в столбцах A, B и C, как показано ниже

City       Count A        Count B       Count C     
----    ------------    -----------    --------
Boston      3               2              1
Chicago     2               1              0

Следующий код даст мне первый столбец. Есть ли способ, которым я могу получить все три столбца, используя один запрос, используя group by?

SELECT City, COUNT(A) as Count A
FROM D1
GROUP BY City
Where City.A = 1

Ответы [ 3 ]

7 голосов
/ 18 июня 2019

Как правило, вместо подсчета вы можете использовать sum().

SELECT City
    ,Sum(A) as CountA
    ,Sum(B) as CountB
    ,Sum(C) as CountC
FROM D1
GROUP BY City

Если столбцы A, B, C имеют тип данных bit, вам необходимо привести их к типу данных, который допускает агрегирование, т.е. integer.

SELECT City
    ,Sum(cast(A as int)) as CountA
    ,Sum(cast(B as int)) as CountB
    ,Sum(cast(C as int)) as CountC
FROM D1
GROUP BY City
2 голосов
/ 18 июня 2019

Если вам нужно использовать count (для возврата 0, если присутствуют нулевые значения), вы можете использовать оператор case в функции count для достижения этого.

declare @city table (
    City char(15),
    A int,
    B int,
    C int
);
insert @city (City, A, B, C)
values
('Boston', 1, 1, 1),
('Chicago', 1, 0, 0),
('Boston', 1, 0, 0),
('Boston', 1, 1, 0),
('Chicago', 1, 1, 0);

select * from @city;

select City,
       count(case when A>0 then 1 end) as CountA,
       count(case when B>0 then 1 end) as CountB,
       count(case when C>0 then 1 end) as CountC
from @city group by City;

enter image description here

0 голосов
/ 18 июня 2019

Попробуйте с помощью функции SUM, например:

SELECT City
    ,Sum(A) as sum_A
    ,Sum(B) as sum_B
    ,Sum(C) as sum_C
FROM D1
GROUP BY City

Пожалуйста, проверьте официальные документы: SUM (Transact-SQL)

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