2016-01-18 3 views
0

У меня есть таблицы SQL, которая содержит три колонки:SQL разделить количество одного столбца

userId 
userName 
item 

и я создал этот SQL запрос, который будет рассчитывать все виды предметов одного пользователя:

select 
    count(ItemID) as 'count of all items types', 
    userId, 
    userName 
from 
    userTable 
where 
    ItemID in (2, 3, 4) 
    and userId = 1 
group by 
    userId, userName 

результат будет выглядеть следующим образом:

+--------+----------+--------------------------+ 
| userId | userName | count of all items types | 
+--------+----------+--------------------------+ 
| 1  | kim  |  25     | 

и я искал способ отделить подсчет itemes типов, поэтому результат должен быть л ike:

+--------+----------+----------------+----------------+-----------------+ 
| userId | userName | count of item1 | count of item2 | count of item3 | 
+--------+----------+----------------+----------------+-----------------+ 
| 1  | kim  |  10   |  10  | 5    | 

ответ

3
SELECT 
    userID, 
    userName, 
    SUM(CASE WHEN ItemID = 2 THEN 1 ELSE 0 END) AS count_of_item1, 
    SUM(CASE WHEN ItemID = 3 THEN 1 ELSE 0 END) AS count_of_item2, 
    SUM(CASE WHEN ItemID = 4 THEN 1 ELSE 0 END) AS count_of_item3 
FROM 
    My_Table 
GROUP BY 
    userID, 
    userName 
2

Это называется условной агрегацией. Для этого используйте CASE.

С COUNT:.

select 
    count(case when ItemID = 1 then 1 end) as count_item1, 
    count(case when ItemID = 2 then 1 end) as count_item2, 
    count(case when ItemID = 3 then 1 end) as count_item3 
... 

(then 1 также может быть ничем иным, кроме нулевой, например then 'count me' Это работает, потому что COUNT рассчитывает ненулевые значения и при опуская ELSE в CASE WHEN вы получаете нулевой Вы могли бы также. явно добавить else null)

Или с SUM:.

select 
    sum(case when ItemID = 1 then 1 else 0 end) as count_item1, 
    sum(case when ItemID = 2 then 1 else 0 end) as count_item2, 
    sum(case when ItemID = 3 then 1 else 0 end) as count_item3 
... 
0

Это, как вы могли бы сделать это:

select userId, 
      username, 
      SUM(CASE WHEN ItemID = '2' THEN 1 ELSE 0 END) AS Item2-Cnt, 
      SUM(CASE WHEN ItemID = '3' THEN 1 ELSE 0 END) AS Item3-Cnt, 
      SUM(CASE WHEN ItemID = '4' THEN 1 ELSE 0 END) AS Item4-Cnt 
    FROM userTable 
    GROUP BY userID, userName 
Смежные вопросы