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
我们使用的系统允许从多个用户定义的字段创建数据输入表单,以满足不同 "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