从SQL中获取/重新排列表中的数据

时间:2013-02-21 14:00:09

标签: sql

我在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菜鸟,所以任何帮助和解释答案的相关链接都会非常感激。

2 个答案:

答案 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"

SQL Fiddle Example

这基本上是一个穷人的数据透视表,它应该适用于大多数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

SQL Fiddle Example