2014-09-28 5 views
1

У меня есть таблица данных транзакций в SQL Server 2012, таких как:TSQL Group двумя колоннами, но результат в той же строке

Month Type 
----- ----- 
1  Paper 
1  Paper 
1  Mobile 
2  Mobile 
3  Paper 
3  Mobile 

Если группа I по месяцам можно легко подсчитать число вхождений операций:

SELECT Month, Count(*) 
FROM Transaction 
GROUP BY Month 

Если группа I по месяцам и Тип:

SELECT Month, Type, Count(Type) AS RowCount 
FROM Transaction 
GROUP BY Month,Type 

Я могу сломать результаты и получить отсчеты для каждого типа. Тем не менее, результаты представлены в разных строках:

Month Type  RowCount 
------ ----- --------- 
1  Paper 2 
1  Mobile 1 
2  Mobile 1 
3  Paper 1 
3  Mobile 1 

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

Month Paper Mobile 
------- ------- -------- 
1  2  1 
2  0  1 
3  1  1 

Есть мысли?

+2

Есть ли у бумаги и мобильных устройств только два типа, которые вы когда-либо имели? – Kermit

+0

в этом случае, да. – sam360

ответ

1

Да, вы можете использовать оператор CASE, и SUM, чтобы сделать это:

Select 
    Month, 
    Sum(Case When Type = 'Paper' Then 1 Else 0 End) As Paper, 
    Sum(Case When Type = 'Mobile' Then 1 Else 0 End) As Mobile 
From [transaction] 
Group By Month 

Sample SQL Fiddle

Так как вы используете SQL Server 2012 вы можете использовать оператор IIF, чтобы сделать код немного более компактный:

SELECT 
    Month, 
    SUM(IIF(TYPE='Paper',1,0)) AS Paper, 
    SUM(IIF(TYPE='Mobile',1,0)) AS Mobile 
FROM [Transaction] 
GROUP BY Month 

Обратите внимание, что сделка - это ключевое слово, которое нужно вставить в скобки.

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

2
SELECT month, 
SUM(CASE WHEN Type='Paper' THEN 1 ELSE 0 END) as Paper, 
SUM(CASE WHEN Type='Mobile' THEN 1 ELSE 0 END) as Mobile 
FROM t 
GROUP BY month 
Смежные вопросы