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
select * from
(
SELECT OrderGUID,UserDataCode,Value
FROM
tst) A
PIVOT(Max(Value)
FOR UserDataCode IN ([OrderName],[OrderDesc],
[CerealYN],[ToastYN],
[ToastDesc],[PaperYN],
[PaperDesc])) AS PVTTable