这是我的桌子。这些数字是对角线的。
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
实际上我想将每个部分的对角行转换为单行。
答案 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
结果如下:
| 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
结果:
| 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
功能来汇总数据,具体取决于数据以及您希望从中获取的内容。