Sql Server PIVOT 将 "reconstruct" 平面 table 转换为列 - 为什么这不起作用?

Sqlserver PIVOT to turn a "reconstruct" a flat table into columns - why does this not work?

我们使用的系统允许从多个用户定义的字段创建数据输入表单,以满足不同 "ORDES" 的特定组所需的信息。然后这些字段根据输入的内容存储在数据库中:

GUID OrderGUID UserDataCode  Value
1    100       OrderName     Breakfast
2    100       OrderDesc     Food you eat before Lunch
3    100       CerealYN      Y
4    100       ToastYN       Y
5    100       ToastDesc     White Bread
6    100       PaperYN       Y
7    100       PaperDesc     The Newsroom
8    101       OrderName     Lunch
9    101       OrderDesc     Food you eat before Dinner
10   101       CerealYN      N
11   101       ToastYN       Y
12   101       ToastDesc     Brown Bread
13   101       PaperYN       Y
14   101       PaperDesc     The MiddayNews
(etc)

(实际上这是一个企业医院软件,但我在这里使用了更简单的例子)

我想使用 SQL 来 return 这个 table PIVOT 如下所示

OrderGUID   OrderName   OrderDESC   CerealYN   ToastYN   ToastDesc    ....
101         Breakfast   Food you..  Y          Y         White Bread  ....
102         Lunch       Food you..  N          Y         Brown Bread  ....

我根据网上找到的例子写了下面的SQL:

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 

SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME([UserDataCode])
FROM (
    SELECT  
        [UserDataCode]
    FROM 
        [XXX].[dbo].[CV3OrderUserData]
    WHERE OrderGUID = 3000680
    ) AS Codes;

--Prepare the PIVOT query using the dynamic

SET @DynamicPivotQuery = N'SELECT OrderGUID, ' + @ColumnName + '
    FROM
        [XXX].[dbo].[CV3OrderUserData]
    PIVOT(Max(Value) 
          FOR UserDataCode IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query

--SELECT @DynamicPivotQuery

EXEC sp_executesql @DynamicPivotQuery

然而,当它按照要求进行数据透视时......并将值放入正确的新 "dynamic" 列中,如果 returns 每个 OrderGUID + 值的行, 即:

OrderGUID   OrderName    OrderDesc   CerealYN   ToastYN
100         Breakfast    null        null       null  ...
100         null         Food you..  null       null  ...
101         null         null        Y          null  ...

etc.etc

我做错了什么:(?

您的查询中的问题是数据透视源查询有 GUID 列,这使得数据透视运算符考虑 GUID 列。

要获得预期的输出,您需要从数据透视源查询中删除 GUID 列。

这是一个static version您可以像以前一样将其转换为动态版本。

select * from
(
SELECT OrderGUID,UserDataCode,Value
    FROM
        tst) A
    PIVOT(Max(Value) 
          FOR UserDataCode IN ([OrderName],[OrderDesc],
                               [CerealYN],[ToastYN],
                              [ToastDesc],[PaperYN],
                              [PaperDesc])) AS PVTTable