用于分组的SQL Server查询

时间:2013-05-06 04:27:32

标签: sql sql-server sql-server-2008 pivot

我有一个包含2列platenoalerts的表格。

Data

plateno    alerts
  A         1
  B         2
  C         2
  A         3
  B         2
  A         4
  A         1

现在我想得到这样的结果:

alerts->   1  2  3  4
---------------------------
A          2  0  1  1
B          0  2  0  0
C          0  1  0  0

我的意思是'A'有两个类型'1'的警报,1个类型'3'和'4'的警报......等等..

这是我正在尝试的查询

Select count(alert) 
from mytable 
group by plateno

4 个答案:

答案 0 :(得分:2)

试试这个: -

Select plateno,[1],[2],[3],[4]
from 
(
 Select plateno,alerts from Sample
)p
pivot 
(
 count(alerts)
 for alerts in ([1],[2],[3],[4])
)pvt

演示Here

答案 1 :(得分:2)

如果列Alert的值的数量未知,则更优先选择动态sql

DECLARE @colList AS NVARCHAR(MAX), @sqlStatement AS NVARCHAR(MAX)

SELECT @colList = STUFF((SELECT DISTINCT ',' + QUOTENAME(alerts) 
                    FROM data
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') ,1,1,'')


SET @sqlStatement = 'SELECT plateno,' + @colList + ' 
             FROM 
             (
                SELECT plateno, alerts 
                FROM data
             ) dta
             pivot 
             (
                COUNT(alerts)
                FOR alerts IN (' + @colList + ')
             ) pvt '

EXECUTE(@sqlStatement)

输出

╔═════════╦═══╦═══╦═══╦═══╗
║ PLATENO ║ 1 ║ 2 ║ 3 ║ 4 ║
╠═════════╬═══╬═══╬═══╬═══╣
║ A       ║ 2 ║ 0 ║ 1 ║ 1 ║
║ B       ║ 0 ║ 2 ║ 0 ║ 0 ║
║ C       ║ 0 ║ 1 ║ 0 ║ 0 ║
╚═════════╩═══╩═══╩═══╩═══╝

答案 2 :(得分:1)

试试这个:

SELECT plateno
,SUM(CASE alerts WHEN 1 THEN 1 ELSE 0 END) AS [1]
,SUM(CASE alerts WHEN 2 THEN 1 ELSE 0 END) AS [2]
,SUM(CASE alerts WHEN 3 THEN 1 ELSE 0 END) AS [3]
,SUM(CASE alerts WHEN 4 THEN 1 ELSE 0 END) AS [4]
FROM Table1
GROUP BY plateno

输出:

╔═════════╦═══╦═══╦═══╦═══╗
║ PLATENO ║ 1 ║ 2 ║ 3 ║ 4 ║
╠═════════╬═══╬═══╬═══╬═══╣
║ A       ║ 2 ║ 0 ║ 1 ║ 1 ║
║ B       ║ 0 ║ 2 ║ 0 ║ 0 ║
║ C       ║ 0 ║ 1 ║ 0 ║ 0 ║
╚═════════╩═══╩═══╩═══╩═══╝

See this SQLFiddle

答案 3 :(得分:0)

Select plateno,sum([1]) as [1],sum([2]) as [2],sum([3]) as [3],sum([4]) as [4]
from 
(
 Select plateno,
  case when alert=1 then 1 else 0 end as [1],
  case when alert=2 then 1 else 0 end as [2],
  case when alert=3 then 1 else 0 end as [3],
  case when alert=4 then 1 else 0 end as [4]
 from planet

 )z
group by plateno

SQL小提琴 here