代码之家  ›  专栏  ›  技术社区  ›  Erick Petrucelli

将4行(1列)转换为5列(1行)时出现透视问题

  •  1
  • Erick Petrucelli  · 技术社区  · 14 年前

    我有一个表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
    

    我尝试在SQLServer2005中使用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
    

    但结果都是空的:

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

    有人能告诉我我做错了什么吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Martin Smith    14 年前

    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
  •  1
  •   Thomas    14 年前

    下面是另一个不涉及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