在两列上从长 table 到宽
Long table to wide on two columns
我想加宽一个长 table,它有两列要加宽。我找到了将长 table 转换为宽的解决方案,但它们都采用一列并将其转换为 n 列。我想取两列并将 table 转换为 2n 列。
我使用这个 solution 成功地加宽了基于一列的 table,但我不确定如何加宽第二列。
这是一个类似于链接解决方案的示例数据集:
Date Person Number1 Number2
2015-01-03 A 4 6
2015-01-04 A 2 5
2015-01-05 A 3 1
2015-01-03 B 5 3
2015-01-04 B 6 4
2015-01-05 B 7 6
我想加宽“Number1”和“Number2”两列,以便输出为:
Date A1 B1 A2 B2
2015-01-03 4 5 6 3
2015-01-04 2 6 5 4
2015-01-05 3 7 1 6
那么,根据 dcislak 对加宽一列的回答,解决方案将是:
select Date,
isNull([A], 0) as A1,
isNull([B], 0) as B1
from
( select Date, Person, Number1, Number2
from tbl ) AS SourceTable
PIVOT
( max(Number1) for Person in ( [A], [B]) ) AS PivotTable;
但是第二个呢?我尝试在 PIVOT
中添加第二行,但这没有用。我想我可以将 table 分成两部分并加入生成的宽 tables 但这似乎是个坏主意,因为它会创建这么长的代码。
对于多列数据透视表,使用case
表达式更容易
select [Date],
A1 = max(case when Person = 'A' then Number1 end),
B1 = max(case when Person = 'B' then Number1 end),
A2 = max(case when Person = 'A' then Number2 end),
B2 = max(case when Person = 'B' then Number2 end)
from SourceTable
group by [Date]
使用 2n
你不需要 pivot,一个简单的 JOIN 就可以了:
SELECT
a.Date,
a.Number1 as "A1",
b.Number1 as "B1",
a.Number2 as "A2",
b.Number2 as "B2"
FROM tbl a
INNER JOIN tbl b on b.Date=a.Date AND b.Person='B'
WHERE a.Person='A'
参见:DBFIDDLE
我想加宽一个长 table,它有两列要加宽。我找到了将长 table 转换为宽的解决方案,但它们都采用一列并将其转换为 n 列。我想取两列并将 table 转换为 2n 列。
我使用这个 solution 成功地加宽了基于一列的 table,但我不确定如何加宽第二列。
这是一个类似于链接解决方案的示例数据集:
Date Person Number1 Number2
2015-01-03 A 4 6
2015-01-04 A 2 5
2015-01-05 A 3 1
2015-01-03 B 5 3
2015-01-04 B 6 4
2015-01-05 B 7 6
我想加宽“Number1”和“Number2”两列,以便输出为:
Date A1 B1 A2 B2
2015-01-03 4 5 6 3
2015-01-04 2 6 5 4
2015-01-05 3 7 1 6
那么,根据 dcislak 对加宽一列的回答,解决方案将是:
select Date,
isNull([A], 0) as A1,
isNull([B], 0) as B1
from
( select Date, Person, Number1, Number2
from tbl ) AS SourceTable
PIVOT
( max(Number1) for Person in ( [A], [B]) ) AS PivotTable;
但是第二个呢?我尝试在 PIVOT
中添加第二行,但这没有用。我想我可以将 table 分成两部分并加入生成的宽 tables 但这似乎是个坏主意,因为它会创建这么长的代码。
对于多列数据透视表,使用case
表达式更容易
select [Date],
A1 = max(case when Person = 'A' then Number1 end),
B1 = max(case when Person = 'B' then Number1 end),
A2 = max(case when Person = 'A' then Number2 end),
B2 = max(case when Person = 'B' then Number2 end)
from SourceTable
group by [Date]
使用 2n
你不需要 pivot,一个简单的 JOIN 就可以了:
SELECT
a.Date,
a.Number1 as "A1",
b.Number1 as "B1",
a.Number2 as "A2",
b.Number2 as "B2"
FROM tbl a
INNER JOIN tbl b on b.Date=a.Date AND b.Person='B'
WHERE a.Person='A'
参见:DBFIDDLE