Sql server SQLServerPivot将“旋转”;“重建”;将一个平面表格分成列-为什么这不起作用?

Sql server SQLServerPivot将“旋转”;“重建”;将一个平面表格分成列-为什么这不起作用?,sql-server,pivot,Sql Server,Pivot,我们使用的系统允许从多个用户定义的字段创建数据输入表单,以满足特定组不同“订单”上所需的信息。然后根据输入的内容将字段存储在数据库中: GUID OrderGUID UserDataCode Value 1 100 OrderName Breakfast 2 100 OrderDesc Food you eat before Lunch 3 100 CerealYN Y 4 100 ToastYN

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

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返回如下所示的数据透视表

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
但是,当它按照要求进行枢轴操作时。。并将值放入正确的新“动态”列中,如果为每个OrderGUID+值返回一行, 即:

等等等等


我做错了什么?(?

< P>)你的查询中的问题是PIVOT源查询有“代码> GuID列,这使得枢轴运算符考虑<代码> GuID列。

要获得预期的输出,需要从pivot源查询中删除
GUID

这是一个
静态版本
,您可以像以前一样将其转换为动态版本

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

谢谢Fireblade-在收到通知时找到了它。返回到basic教程并发现错误-
select * from
(
SELECT OrderGUID,UserDataCode,Value
    FROM
        tst) A
    PIVOT(Max(Value) 
          FOR UserDataCode IN ([OrderName],[OrderDesc],
                               [CerealYN],[ToastYN],
                              [ToastDesc],[PaperYN],
                              [PaperDesc])) AS PVTTable