用于分组的SQL Server查询
我有一个表,有两列用于分组的SQL Server查询,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,我有一个表,有两列plateno和alerts 表数据 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
plateno
和alerts
表数据
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”的警报,一个类型为“3”和“4”的警报……以此类推
这是我正在尝试的问题
Select count(alert)
from mytable
group by plateno
试试这个:
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 ║
╚═════════╩═══╩═══╩═══╩═══╝
╔═════════╦═══╦═══╦═══╦═══╗
║ PLATENO ║ 1 ║ 2 ║ 3 ║ 4 ║
╠═════════╬═══╬═══╬═══╬═══╣
║ A ║ 2 ║ 0 ║ 1 ║ 1 ║
║ B ║ 0 ║ 2 ║ 0 ║ 0 ║
║ C ║ 0 ║ 1 ║ 0 ║ 0 ║
╚═════════╩═══╩═══╩═══╩═══╝
试试这个:
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 ║
╚═════════╩═══╩═══╩═══╩═══╝
╔═════════╦═══╦═══╦═══╦═══╗
║ PLATENO ║ 1 ║ 2 ║ 3 ║ 4 ║
╠═════════╬═══╬═══╬═══╬═══╣
║ A ║ 2 ║ 0 ║ 1 ║ 1 ║
║ B ║ 0 ║ 2 ║ 0 ║ 0 ║
║ C ║ 0 ║ 1 ║ 0 ║ 0 ║
╚═════════╩═══╩═══╩═══╩═══╝
试试这个:-
Select plateno,[1],[2],[3],[4]
from
(
Select plateno,alerts from Sample
)p
pivot
(
count(alerts)
for alerts in ([1],[2],[3],[4])
)pvt
演示试试这个:-
Select plateno,[1],[2],[3],[4]
from
(
Select plateno,alerts from Sample
)p
pivot
(
count(alerts)
for alerts in ([1],[2],[3],[4])
)pvt
演示如果列
警报
的值数目未知,则更倾向于使用动态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)
如果列
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)
SQL fiddle您尝试使用的SQL查询在哪里?您尝试使用的SQL查询在哪里?