在两个组上使用 SQL unpivot

Using SQL unpivot on two groups

我有一个 table 如下:

Name    ValueA1    ValueA2    ValueA3    ValueB1    ValueB2    ValueB3    QtyA1    QtyA2    QtyA3    QtyB1    QtyB2    QtyB3
John    1          2          3          4          5          6          100      200      300      150      250      350
Dave    11         12         13         14         15         16         100      200      300      150      250      350

我可以使用 unpivot 获取值:

select [Name]
     , Replace(u.[Period],'Value','') as [Period]
     , u.[Value]
from Table1
unpivot
(
  [Value]
  for [Period] in ([ValueA1], [ValueA2], [ValueA3], [ValueB1], [ValueB2], [ValueB3])
  ) u;

SQL Fiddle

但是我试图将 ValueQty 列都放在一行中,我最终想要的是:

Name    Number  Value   Qty
John    A1      1       100
John    A2      2       200
John    A3      3       300
John    B1      4       150
John    B2      5       250
John    B3      6       350
Dave    A1      11      100
Dave    A2      12      200
Dave    A3      13      300
Dave    B1      14      150
Dave    B2      15      250
Dave    B3      16      350

到目前为止我所拥有的是(根本不起作用):

select [Name]
     , Replace(u.[Period],'Value','') as [Period]
     , u.[Value]
     , u2.[Value]
from Table1
unpivot
(
  [Value]
  for [Period] in ([ValueA1], [ValueA2], [ValueA3], [ValueB1], [ValueB2], [ValueB3])
  ) u

 unpivot

 (
   [Qty]
   for [Period] in ([QtyA1], [QtyA2], [QtyA3], [QtyB1], [QtyB2], [QtyB3])

 ) u2;

我想用 unpivot 做的事情是否可行?

您可以通过在值子句中指定对来使用简单的申请:

declare @table table (Name varchar(10), ValueA1 int, ValueA2 int, QtyA1 int, QtyA2 int);
insert into @table
select 'John', 1, 2, 100, 200 union all     
select 'Dave', 11, 12, 100, 200;


select  Name, Number, Value, Qty 
from    @table
cross 
apply   (   values 
            ('A1', ValueA1, QtyA1),
            ('A2', ValueA2, QtyA2)
        ) c (number, value, qty);

If you're using an older edition of MSSQL, you might need to use this instead of the values clause above:

cross 
apply (   select 'A1', ValueA1, QtyA1 union all
          select 'A2', ValueA2, QtyA2
      ) c (number, value, qty);

Returns:

Name    Number  Value   Qty
John    A1      1       100
John    A2      2       200
Dave    A1      11      100
Dave    A2      12      200