在两列上从长 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