SQL pivot / VLOOKUP查询

时间:2017-11-16 09:18:59

标签: sql sql-server

我有以下简化表,因此每个股票代码都有 多个仓库,我想" pivot"它让我可以得到 每个仓库的成本仅为1行中的股票代码

Stockcode | Warehouse | Cost 
A100        WH          100$
A100        ZZ          200$

我想要的是以下内容。 因此,只有1个股票代码行与仓库成本相关联。

Stockcode | Cost WH | Cost ZZ
A100        100$      200$

我目前通过将它导出到excell,创建一个新工作表并使用VLOOKUP向主表添加一个新列并添加这样的ZZ成本来实现它。

你会如何在SQL中解决这个问题?我有点不了解如何以这种方式转换这些表格数据。

3 个答案:

答案 0 :(得分:1)

但是,如果您不想使用casepivot

,也可以使用简单的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;

测试on SQLFiddle

答案 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)

我的另一个答案 - Display count results of requests with results of jobs horizontally and locations vertically 3 tables