我有以下简化表,因此每个股票代码都有 多个仓库,我想" pivot"它让我可以得到 每个仓库的成本仅为1行中的股票代码
Stockcode | Warehouse | Cost
A100 WH 100$
A100 ZZ 200$
我想要的是以下内容。 因此,只有1个股票代码行与仓库成本相关联。
Stockcode | Cost WH | Cost ZZ
A100 100$ 200$
我目前通过将它导出到excell,创建一个新工作表并使用VLOOKUP向主表添加一个新列并添加这样的ZZ成本来实现它。
你会如何在SQL中解决这个问题?我有点不了解如何以这种方式转换这些表格数据。
答案 0 :(得分:1)
但是,如果您不想使用case
或pivot
dynamic pivot
表达式来执行此操作
SELECT
Stockcode ,
MAX( CASE (Warehouse) WHEN 'WH' THEN Cost END)[Cost WH],
MAX(CASE (Warehouse) WHEN 'ZZ' THEN Cost END) [Cost ZZ]
FROM <table> GROUP BY Stockcode
动态pivot
方式:
DECLARE @Col nvarchar(max), @query nvarchar(max)
select @Col = STUFF(
(SELECT ',' +QUOTENAME(Warehouse) FROM <table> FOR XML PATH('')),
1, 1, ''
)
SELECT @query = N'select Stockcode, [WH] as CostWH, [ZZ] as CostZZ
from (
select Stockcode, Warehouse, Cost
from <table>) p
pivot (max(Cost) for Warehouse in ('+@Col+')
) as pvt order by Stockcode;'
exec(@query)
结果:
Stockcode Cost WH Cost ZZ
A100 100$ 200$
答案 1 :(得分:1)
以下是使用PIVOT:
进行此查询的方法select Stockcode, [WH] as CostWH, [ZZ] as CostZZ
from (
select Stockcode, Warehouse, Cost
from MyTable
) p
pivot (
MAX(Cost)
for Warehouse in ([WH], [ZZ])
) as pvt
order by Stockcode;
答案 2 :(得分:1)
我认为(Stockcode,Warehouse)
在您的表格中是独一无二的。
我认为你可以使用PIVOT
喜欢它
SELECT Stockcode,[WH],[ZZ]
FROM TestData PIVOT(MAX(Cost) FOR Warehouse IN([WH],[ZZ])) p
使用动态查询为所有仓库生成查询
DECLARE @Warehouses varchar(500)=''
SELECT @Warehouses+=CONCAT(',[',Warehouse,']')
FROM
(
SELECT DISTINCT Warehouse
FROM TestData
) q
ORDER BY Warehouse
SET @Warehouses=STUFF(@Warehouses,1,1,'')
PRINT @Warehouses
DECLARE @query varchar(2000)=CONCAT('SELECT Stockcode,',@Warehouses,'
FROM TestData PIVOT(MAX(Cost) FOR Warehouse IN(',@Warehouses,')) p')
PRINT @query
EXEC(@query)