Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于分组的SQL Server查询_Sql_Sql Server_Sql Server 2008_Pivot - Fatal编程技术网

用于分组的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 fiddle

您尝试使用的SQL查询在哪里?您尝试使用的SQL查询在哪里?