您可以使用 PIVOT 函数来获取结果。由于您将拥有未知数量的SKU
值,因此我将首先编写查询的硬编码版本,然后将其转换为动态 SQL。
由于您有两列要从中透视数据value
和volume
,那么我首先将这两列取消透视为多行,然后应用 PIVOT 函数。unpivot 语法可以使用 UNPIVOT 函数或 CROSS APPLY:
select col = t.sku+'_'+ c.col,
c.val
from yourtable t
cross apply
(
select 'value', value union all
select 'volume', volume
) c (col, val)
请参阅演示。这给出了一个结果:
| COL | VAL |
| AB_value | 2 |
| AB_volume | 3 |
| AB_value | 2 |
| AB_volume | 2 |
| BB_value | 1 |
| BB_volume | 3 |
将数据转换为与此类似的格式后,您可以应用 PIVOT:
select AB_Value, BB_Value, AB_Volume, BB_Volume
from
(
select col = t.sku+'_'+ c.col,
c.val
from yourtable t
cross apply
(
select 'value', value union all
select 'volume', volume
) c (col, val)
) d
pivot
(
sum(val)
for col in (AB_Value, BB_Value, AB_Volume, BB_Volume)
) piv;
请参阅SQL Fiddle with Demo。现在,由于您将拥有未知数量的值,因此您将不得不使用动态 SQL 来生成您需要执行的 SQL 字符串:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(sku+'_'+col)
from yourtable
cross apply
(
select 'value', 1 union all
select 'volume', 2
) c (col, so)
group by sku, so, col
order by so, sku
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + '
from
(
select col = t.sku+''_''+ c.col,
c.val
from yourtable t
cross apply
(
select ''value'', value union all
select ''volume'', volume
) c (col, val)
) x
pivot
(
sum(val)
for col in (' + @cols + ')
) p '
execute sp_executesql @query;
请参阅SQL Fiddle with Demo。两个版本都给出了结果:
| AB_VALUE | BB_VALUE | AB_VOLUME | BB_VOLUME |
| 4 | 1 | 5 | 3 |