【问题标题】:PIVOT problem when converting 4 Rows (1 Column) to 5 Columns (1 Row)将 4 行(1 列)转换为 5 列(1 行)时出现 PIVOT 问题
【发布时间】:2011-03-31 18:50:56
【问题描述】:

我有一个表 var,其中有一些行,但只有一列 DATETIME 类型,如下所示:

[Day]
2010-08-03
2010-08-04
2010-08-10
2010-08-11

我需要在某些列上显示,但只在一行中显示。 我的结果集将限制为 5 行,然后我也可以限制为 5 列。 我需要的示例:

[Day1]      [Day2]      [Day3]      [Day4]      [Day5]
2010-08-03  2010-08-04  2010-08-10  2010-08-11  NULL

我试图在 SQL Server 2005 中使用 PIVOT 来实现。 但是所有示例都使用更多列来聚合值,那我不明白。

这是我正在尝试的查询:

SELECT r.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY Day ASC) Line, Day FROM @MyDays) AS o
PIVOT (MIN(Line) FOR Day IN (Day1, Day2, Day3, Day4, Day5)) AS r

但是结果都是NULL:

[Day1]  [Day2]  [Day3]  [Day4]  [Day5]
NULL    NULL    NULL    NULL    NULL

谁能告诉我我做错了什么?

【问题讨论】:

    标签: sql-server-2005 tsql pivot


    【解决方案1】:

    Row_Number() 只返回列表 1-5 中的一个数字,因此它不会匹配列表“Day1, Day2, Day3, Day4, Day5”中的任何内容。我已将“Day”附加到前面,所以它会。

    另外你有MIN(Line) FOR Day IN,这需要反过来。您要显示的是Day 的值。

    ;with mydays as
    (
    
    SELECT '2010-08-03' AS [Day] UNION
    SELECT '2010-08-04' AS [Day] UNION
    SELECT '2010-08-10' AS [Day] UNION
    SELECT '2010-08-11' AS [Day] 
    )
    SELECT r.* FROM (
       SELECT 
          'Day' + CAST( ROW_NUMBER() OVER (ORDER BY Day ASC)as varchar(10)) Line, 
           Day 
       FROM mydays) AS o
    PIVOT (MIN([Day]) FOR Line IN (Day1, Day2, Day3, Day4, Day5)) AS r
    

    【讨论】:

    • 现在我明白了:行中的值应该与我想要的列名相同。谢谢,完美!
    【解决方案2】:

    这是另一个不涉及 Pivot 语句的解决方案:

    With RawData As
        (
        Select '2010-08-03' AS [Day]
        Union All Select '2010-08-04' 
        Union All Select '2010-08-10'
        Union All Select '2010-08-11'
        )
        , NumberedItems As
        (
        Select Day, Row_Number() Over( Order By Day ) As Line
        From RawData
        )
    Select Min ( Case When Line = 1 Then [Day] End ) As Day1
        , Min ( Case When Line = 2 Then [Day] End ) As Day2
        , Min ( Case When Line = 3 Then [Day] End ) As Day3
        , Min ( Case When Line = 4 Then [Day] End ) As Day4
        , Min ( Case When Line = 5 Then [Day] End ) As Day5
    From NumberedItems
    

    【讨论】:

    • 非常有趣,但我认为使用 PIVOT 的语法更容易阅读。不使用 PIVOT 时有显着的性能提升吗?
    猜你喜欢
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多