我在sql中有数据看起来像这样:
Month PersonID Level
01 102 2
01 506 1
02 617 3
02 506 1
03 297 2
我需要查询此数据以接收它以用于看起来像这样的表
Jan Feb March ...etc
Level 1
Level 2
Level 3
值是每个月每个级别的人数。
我是一个完整的SQL菜鸟,所以任何帮助和解释答案的相关链接都会非常感激。
答案 0 :(得分:3)
试试这个:
SELECT 'Level' + CAST(level as varchar), [January], [February], [March]
FROM (SELECT DATENAME(month, '2013'+Month+'01') Month, PersonID, Level FROM Tbl) T
PIVOT
(
COUNT(PersonID) FOR Month IN ([January], [February], [March])
) A
<强> SQL FIDDLE DEMO 强>
答案 1 :(得分:2)
SELECT 'Level ' + CAST("Level" AS VARCHAR(2)),
SUM(CASE Month WHEN '01' THEN 1 ELSE 0 END) AS Jan,
SUM(CASE Month WHEN '02' THEN 1 ELSE 0 END) AS Feb,
SUM(CASE Month WHEN '03' THEN 1 ELSE 0 END) AS Mar,
...
FROM myTable
GROUP BY "Level"
这基本上是一个穷人的数据透视表,它应该适用于大多数RDBMS。它的作用是使用带有CASE的SUM来实现每个月的计数。也就是说,对于1月,如果Month
='01',则每行的值将为1,否则为0。对这些值求和可得到表中所有“1月”行的总数。
GROUP BY Level
子句告诉引擎为Level
中的每个不同值生成一个结果行,从而将数据分成不同的级别。
由于您使用的是支持PIVOT
的SQL Server 2005,因此您可以执行以下操作:
SELECT 'Level ' + CAST("Level" AS VARCHAR(2)),
[01] AS [Jan], [02] AS [Feb], [03] AS [Mar], ...
FROM myTable
PIVOT
(
COUNT(PersonId)
FOR Month IN ([01], [02], [03], ...)
) x