0

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

4

2 回答 2

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 小提琴演示

于 2013-02-21T14:09:57.117 回答
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 小提琴示例

这基本上是一个穷人的数据透视表,应该适用于大多数 RDBMS。它所做的是使用带有 CASE 的 SUM 来实现每个月的计数。也就是说,对于一月份,如果 = '01',每行的值为 1 Month,否则为 0。将这些值相加得到表中所有“一月”行的总数。

GROUP BY Level子句告诉引擎为 中的每个不同值生成一个结果行Level,从而按不同级别分隔数据。


由于您使用的是支持 的 SQL Server 2005,因此PIVOT您可以简单地执行以下操作:

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 小提琴示例

于 2013-02-21T14:06:17.580 回答