如何将对角线行转换为单行?

时间:2012-12-07 04:24:21

标签: sql sql-server-2008

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

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

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

2 个答案:

答案 0 :(得分:4)

这个评论太长了,所以我回答。

您的数据来自何处,如果是数据表或来自查询,则不是很清楚。您提供的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字段,则结果将与您的相同。

<强> PIVOT

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 :(得分:3)

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

因此,除非您尚未向我们展示完整的源表(例如其中包含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功能来汇总数据,具体取决于数据以及您希望从中获取的内容。