【问题标题】:PIVOT syntax in SQL Server 2005SQL Server 2005 中的 PIVOT 语法
【发布时间】:2009-08-21 10:37:24
【问题描述】:

用这个查询拉我的头发。也许这里的一些专家可以看出我做错了什么?

我有一个时间表如下:

CREATE TABLE TimeSheetTime(
    TimeSheetTimeID int IDENTITY(1,1) NOT NULL,
    TimeSheetItemID int NOT NULL,
    OffsetToEntryDate tinyint NOT NULL,
    Hours float NOT NULL
)

其中填充了一些数据,如下所示:

INSERT TimeSheetTime (TimeSheetItemID, OffsetToEntryDate, Hours)
SELECT 1,1,7 
UNION SELECT 1,3,1.5
UNION SELECT 1,0,1
UNION SELECT 2,1,0
UNION SELECT 2,4,0
UNION SELECT 2,3,0
UNION SELECT 3,2,0
UNION SELECT 3,4,1
UNION SELECT 3,5,2
UNION SELECT 3,1,2
UNION SELECT 3,2,4
UNION SELECT 4,3,5
UNION SELECT 4,5,16
UNION SELECT 4,2,1
UNION SELECT 5,3,0.5
UNION SELECT 5,4,1
UNION SELECT 5,3,1
UNION SELECT 5,4,4
UNION SELECT 6,5,4
UNION SELECT 6,1,0.5
UNION SELECT 6,2,3.2
UNION SELECT 7,3,0.2
UNION SELECT 7,5,1.5
UNION SELECT 7,1,0.1
UNION SELECT 8,3,0.4
UNION SELECT 8,5,0.5
UNION SELECT 8,1,0.3
UNION SELECT 8,3,1
UNION SELECT 9,5,2
UNION SELECT 9,3,0.5

现在我想返回一个数据集,其中包含 TimeSheetItemID 后跟 PIVOT SUM of Hours,排列在 OffsetToEntryDate 列中。 即:

TimeSheetItemID | 0 | 1 | 2 | 3 | 4 | 5 | 6

我尝试了以下

SELECT *
FROM TimeSheetTime
pivot 
(
    SUM(Hours)
    FOR OffSetToEntryDate
    IN (0,1,2,3,4,5,6)
) as TST

欢迎提出任何建议。

【问题讨论】:

    标签: sql-server sql-server-2005 tsql pivot


    【解决方案1】:

    改用这个:

    SELECT *
    FROM TimeSheetTime
    pivot 
    (
        SUM(Hours)
        FOR OffSetToEntryDate
        IN ([0],[1],[2],[3],[4],[5],[6])
    ) as TST
    

    您要在 PIVOT 表中使用的列必须放在方括号 [ ... ]

    得到这些结果:

    TimeSheetTimeID TimeSheetItemID 0   1   2   3   4   5   6
    1   1   1   NULL    NULL    NULL    NULL    NULL    NULL
    2   1   NULL    7   NULL    NULL    NULL    NULL    NULL
    3   1   NULL    NULL    NULL    1.5 NULL    NULL    NULL
    4   2   NULL    0   NULL    NULL    NULL    NULL    NULL
    5   2   NULL    NULL    NULL    0   NULL    NULL    NULL
    6   2   NULL    NULL    NULL    NULL    0   NULL    NULL
    7   3   NULL    2   NULL    NULL    NULL    NULL    NULL
    8   3   NULL    NULL    0   NULL    NULL    NULL    NULL
    9   3   NULL    NULL    4   NULL    NULL    NULL    NULL
    10  3   NULL    NULL    NULL    NULL    1   NULL    NULL
    11  3   NULL    NULL    NULL    NULL    NULL    2   NULL
    12  4   NULL    NULL    1   NULL    NULL    NULL    NULL
    13  4   NULL    NULL    NULL    5   NULL    NULL    NULL
    14  4   NULL    NULL    NULL    NULL    NULL    16  NULL
    15  5   NULL    NULL    NULL    0.5 NULL    NULL    NULL
    16  5   NULL    NULL    NULL    1   NULL    NULL    NULL
    17  5   NULL    NULL    NULL    NULL    1   NULL    NULL
    18  5   NULL    NULL    NULL    NULL    4   NULL    NULL
    19  6   NULL    0.5 NULL    NULL    NULL    NULL    NULL
    20  6   NULL    NULL    3.2 NULL    NULL    NULL    NULL
    21  6   NULL    NULL    NULL    NULL    NULL    4   NULL
    22  7   NULL    0.1 NULL    NULL    NULL    NULL    NULL
    23  7   NULL    NULL    NULL    0.2 NULL    NULL    NULL
    24  7   NULL    NULL    NULL    NULL    NULL    1.5 NULL
    25  8   NULL    0.3 NULL    NULL    NULL    NULL    NULL
    26  8   NULL    NULL    NULL    0.4 NULL    NULL    NULL
    27  8   NULL    NULL    NULL    1   NULL    NULL    NULL
    28  8   NULL    NULL    NULL    NULL    NULL    0.5 NULL
    29  9   NULL    NULL    NULL    0.5 NULL    NULL    NULL
    30  9   NULL    NULL    NULL    NULL    NULL    2   NULL
    

    马克

    【讨论】:

      【解决方案2】:

      好的,想通了。似乎无法对数字类型字段值进行 PIVOT。以下效果很好。现在我只需要弄清楚如何让它在我的应用程序中工作。

      DECLARE @TimeSheetTime TABLE (
          TimeSheetItemID int NOT NULL,
          OffsetToEntryDate varchar(4) NOT NULL,
          Hours float NOT NULL
      )
      
      INSERT @TimeSheetTime (TimeSheetItemID, OffsetToEntryDate, Hours)
      SELECT 1,'a1',7 
      UNION SELECT 1,'a3',1.5
      UNION SELECT 1,'a0',1
      UNION SELECT 2,'a1',0
      UNION SELECT 2,'a4',0
      UNION SELECT 2,'a3',0
      UNION SELECT 3,'a2',0
      UNION SELECT 3,'a4',1
      UNION SELECT 3,'a5',2
      UNION SELECT 3,'a1',2
      UNION SELECT 3,'a2',4
      UNION SELECT 4,'a3',5
      UNION SELECT 4,'a5',16
      UNION SELECT 4,'a2',1
      UNION SELECT 5,'a3',0.5
      UNION SELECT 5,'a4',1
      UNION SELECT 5,'a3',1
      UNION SELECT 5,'a4',4
      UNION SELECT 6,'a5',4
      UNION SELECT 6,'a1',0.5
      UNION SELECT 6,'a2',3.2
      UNION SELECT 7,'a3',0.2
      UNION SELECT 7,'a5',1.5
      UNION SELECT 7,'a1',0.1
      UNION SELECT 8,'a3',0.4
      UNION SELECT 8,'a5',0.5
      UNION SELECT 8,'a1',0.3
      UNION SELECT 8,'a3',1
      UNION SELECT 9,'a5',2
      UNION SELECT 9,'a3',0.5
      
      SELECT * FROM @TimeSheetTime
      PIVOT (
          SUM(Hours)
          FOR OffsetToEntryDate
          IN (a0,a1,a2,a3,a4,a5,a6)
      ) AS p
      

      【讨论】:

        猜你喜欢
        • 2012-10-03
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多