【问题标题】:How to convert diagonal rows into a single row?如何将对角线行转换为单行?
【发布时间】:2012-12-07 19:08:54
【问题描述】:

这是我的桌子。数字是对角线的。

Engineering  Financials  Scope  Schedule  Risks  People
--------------------------------------------------------
1            NULL        NULL   NULL      NULL   NULL
NULL         0           NULL   NULL      NULL   NULL
NULL         NULL        0      NULL      NULL   NULL
NULL         NULL        NULL   0         NULL   NULL
NULL         NULL        NULL   NULL      0      NULL
2            NULL        NULL   NULL      NULL   NULL
NULL         4           NULL   NULL      NULL   NULL
NULL         NULL        3      NULL      NULL   NULL
NULL         NULL        NULL   4         NULL   NULL
NULL         NULL        NULL   NULL      4      NULL
NULL         NULL        NULL   NULL      NULL   0
0            NULL        NULL   NULL      NULL   NULL
NULL         0           NULL   NULL      NULL   NULL
NULL         NULL        0      NULL      NULL   NULL
NULL         NULL        NULL   0         NULL   NULL
NULL         NULL        NULL   NULL      0      NULL
NULL         NULL        NULL   NULL      NULL   0
0            NULL        NULL   NULL      NULL   NULL
NULL         0           NULL   NULL      NULL   NULL
NULL         NULL        0      NULL      NULL   NULL
NULL         NULL        NULL   0         NULL   NULL
NULL         NULL        NULL   NULL      0      NULL
NULL         NULL        NULL   NULL      NULL   0
1            NULL        NULL   NULL      NULL   NULL
NULL         0           NULL   NULL      NULL   NULL
NULL         NULL        5      NULL      NULL   NULL
NULL         NULL        NULL   4         NULL   NULL
NULL         NULL        NULL   NULL      3      NULL
NULL         NULL        NULL   NULL      NULL   3

我希望那些出现在这个输出中:

Engineering  Financials  Scope  Schedule  Risks  People
--------------------------------------------------------
1            0           0      0         0      NULL
2            4           3      4         4      0
0            0           0      0         0      0
0            0           0      0         0      0
0            0           0      0         0      0
1            0           5      4         3      3

实际上我想将这些对角线行转换为每个部分的单行。

【问题讨论】:

  • 请编辑您的问题并使用代码工具 ({}) 格式化表格。
  • 是否有一个键列将对角行绑定在一起?换句话说,你怎么知道前 5 行相互关联,而后 6 行相互关联?
  • @Akhil---如何编辑我的问题,我做不到
  • 您可以通过点击问题底部标签下方的编辑来编辑问题。
  • @Puskar 你用你的pivot解决了这个问题吗?

标签: sql sql-server-2008


【解决方案1】:

您想要的聚合结果似乎基于表中行的顺序。在表格中,行顺序无关紧要,假设顺序保持不变是很危险的。

因此,除非您尚未向我们展示完整的源表(例如其中包含 Section 列),否则很难为您提供对这个问题有帮助的答案。


编辑:

如果您一个Section 列,您可以使用以下查询来获得您想要的结果:

SELECT   Section
         ,SUM(Engineering) AS Engineering
         ,SUM(Financials) AS Financials
         ,SUM(Scope) AS Scope
         ,SUM(Schedule) AS Schedule
         ,SUM(Risks) AS Risks
         ,SUM(People) AS People
FROM     YourTable
GROUP BY Section;

除了使用SUM 函数来聚合您的数据,您还可以使用MAX 或其他函数,具体取决于数据和您想要从中得到什么。

【讨论】:

    【解决方案2】:

    这太长了,不能作为评论,所以我正在回答。

    不清楚您的数据来自哪里,是数据表还是来自查询。您的previous question was about a PIVOT 和您提供的数据与相同的数据相匹配,所以我猜测这是来自该查询。

    如果您使用PIVOT 查询,并且子查询中有太多字段,则可能会发生这种行为。

    样本数据查询1

    CREATE TABLE yourtable ([Name] varchar(11), [Rating] int);
    
    INSERT INTO yourtable ([Name], [Rating])
    VALUES
        ('Engineering', 1),
        ('Financials', 3),
        ('Scope', 1),
        ('Schedule', 2),
        ('Risks', 3),
        ('People', 3);
    

    PIVOT 将提供正确的结果

    select *
    from
    (
      select name, rating
      from yourtable
    ) src
    pivot
    (
      max(rating)
      for name in ([Engineering], [Financials], [Scope],
                   [Schedule], [Risks], [People])
    ) piv
    

    SQL Fiddle with Demo

    结果如下:

    | ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
    ----------------------------------------------------------------
    |           1 |          3 |     1 |        2 |     3 |      3 |
    

    以上将是正确的语法,因为您有一行条目。现在,如果我稍微改变一下这个查询,你就会看到不同之处:

    示例数据查询 2:我在此添加了一个 id 字段

    CREATE TABLE yourtable([Name] varchar(11), [Rating] int, id int);
    
    INSERT INTO yourtable([Name], [Rating], id)
    VALUES
        ('Engineering', 1, 1),
        ('Financials', 3, 2),
        ('Scope', 1, 3), 
        ('Schedule', 2, 4),
        ('Risks', 3, 5),
        ('People', 3, 6);
    

    如果我执行PIVOT 并包含此ID 字段,结果将与您的结果相似。

    枢轴

    select [Engineering], [Financials], [Scope], [Schedule], [Risks], [People]
    from
    (
      select name, rating, id  -- notice the addition of the id column
      from yourtable
    ) src
    pivot
    (
      max(rating)
      for name in ([Engineering], [Financials], [Scope],
                   [Schedule], [Risks], [People])
    ) piv
    

    SQL Fiddle with Demo

    结果:

    | ENGINEERING | FINANCIALS |  SCOPE | SCHEDULE |  RISKS | PEOPLE |
    ------------------------------------------------------------------
    |           1 |     (null) | (null) |   (null) | (null) | (null) |
    |      (null) |          3 | (null) |   (null) | (null) | (null) |
    |      (null) |     (null) |      1 |   (null) | (null) | (null) |
    |      (null) |     (null) | (null) |        2 | (null) | (null) |
    |      (null) |     (null) | (null) |   (null) |      3 | (null) |
    |      (null) |     (null) | (null) |   (null) | (null) |      3 |
    

    如您所见,添加此额外列会重现您遇到的问题。我的建议是发布您的表结构,然后发布您用来获取结果的查询。从那时起,我们将能够为您提供帮助。

    【讨论】:

    • +1,更多信息确实会有所帮助!上一个问题找到here
    • 这是对这种“对角线”行为的绝妙解释。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2021-12-31
    • 2021-08-27
    • 2020-12-22
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多