递归CTE或While循环

时间:2014-08-13 22:59:02

标签: sql sql-server

我试图将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循环来完成。 任何帮助非常感谢。

1 个答案:

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