我试图将Orders表中的列VNLAMNT,MXBAMNT,HZLAMNT,DARKAMNT,STWBRYAMNT转入行,并以最有效的方式将ChocolateType表中的值Description附加到每一行。
表模式如下:
ChocolateTypes
Id | Description
订单
CUSTOMERCLASS | OFFICE | LOCATION | VNLAMNT | MXBAMNT | HZLAMNT | DARKAMNT | STWBRYAMNT
我希望结果集看起来像这样,有15条记录(3条描述* 5列),按照Fiddle表中的值:
结果
CUSTOMERCLASS | OFFICE | LOCATION | VALUE | TYPE
Proprietary Head Chicago 2 Vanilla
Proprietary Head Chicago 14 MixedBerry
Proprietary Head Chicago 14 Hazelnut
Proprietary Head Chicago 14 Dark
Proprietary Head Chicago 14 Strawberry
我有小提琴中的表格:http://sqlfiddle.com/#!3/10f89/1/0
使用VNLAMNT,MXBAMNT,HZLAMNT,DARKAMNT,STWBRYAMNT列中的值填充VALUE。序列始终如上所述。 TYPE使用ChocolateTypes表中的Description填充。
我看过递归CTE,看起来这些并不是循环记录的最有效方式,但我不确定如何使用CTE或使用While循环来完成。 任何帮助非常感谢。
答案 0 :(得分:2)
不需要递归CTE,也不需要while循环只需UPIVOT查询就可以了,请参阅下文.....
;WITH CTE
AS (
SELECT ORDERID
,CUSTOMERCLASS
,OFFICE
,LOCATION
,VALUE
,CASE [TYPE]
WHEN 'MXBAMNT' THEN 1
WHEN 'VNLAMNT' THEN 2
WHEN 'HZLAMNT' THEN 3
WHEN 'STWBRYAMNT' THEN 4
WHEN 'DARKAMNT' THEN 5
END AS [TYPE]
FROM dbo.Orders
UNPIVOT ( VALUE FOR [TYPE]
IN (VNLAMNT, MXBAMNT, HZLAMNT, DARKAMNT, STWBRYAMNT)
)up
)
SELECT C.ORDERID
,C.CUSTOMERCLASS
,C.OFFICE
,C.LOCATION
,C.VALUE
,CT.[DESCRIPTION]
FROM CTE C INNER JOIN dbo.ChocolateTypes CT
ON C.[TYPE] = CT.ID
SQL FIDDLE