代码之家  ›  专栏  ›  技术社区  ›  Joshua

SQL Server 2005中的透视语法

  •  2
  • Joshua  · 技术社区  · 15 年前

    用这个问题把我的头发拔出来。也许这里的一些专家能看出我做错了什么?

    我有如下时间表:

    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
    

    现在,我想返回一个数据集,该数据集的时间表项ID后跟小时数的轴和,排列在offsettoEntryDate列中。 IE:

    时间表项ID 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
    

    如有任何建议,我们将不胜感激。

    2 回复  |  直到 15 年前
        1
  •  4
  •   marc_s    15 年前

    改为使用:

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

    要在数据透视表中使用的列必须放在方括号中 [ ... ] .

    获取这些结果:

    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
  •  0
  •   Joshua    15 年前

    好的,明白了。似乎无法对数字类型字段值执行透视。以下各项工作正常。现在我只需要弄清楚如何使它在我的应用程序中工作。

    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