sql-server - TSQL:基于 varchar 值的动态透视不能正常工作
问题描述
我正在使用 2 张桌子:
- zEaAttributes:用于字段列表
- zEAValues:我们想要转换的数据
我期望得到的结果将是这样的一行数据:
Name Street Address State County Zip
--------------------------------------------
Ajax ABC 1st Ave. TX NULL NULL
但相反,我得到了 3 行,如下所示:
Name Street Address State County Zip
---------------------------------------------
Ajax NULL NULL NULL NULL
NULL ABC 1st Ave. NULL NULL NULL
NULL NULL TX NULL NULL
下面是用于创建和填充我们正在测试的 2 个表的 SQL。请让我知道我做错了什么。
谢谢你。
CREATE TABLE [dbo].[zEaAttributes]
(
[Ent_Id] [uniqueidentifier] NOT NULL,
[Position] [smallint] NOT NULL,
[Caption] [varchar](50) NULL
) ON [PRIMARY]
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id], [Position], [Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 1, 'Name')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id], [Position], [Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 2, 'Street Address')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id], [Position], [Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 3, 'State')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id], [Position], [Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 4, 'County')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id], [Position], [Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 5, 'Zip')
CREATE TABLE [dbo].[zEAValues]
(
[Ent_Id] [uniqueidentifier] NOT NULL,
[Position] [smallint] NOT NULL,
[Caption] [varchar](50) NULL,
[Value] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
INSERT INTO [dbo].[zEAValues] ([Ent_Id], [Position], [Caption], [Value])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 1, 'Name', N'Ajax')
INSERT INTO [dbo].[zEAValues] ([Ent_Id], [Position], [Caption], [Value])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 2, 'Street Address', N'ABC 1st Ave.')
INSERT INTO [dbo].[zEAValues] ([Ent_Id], [Position], [Caption], [Value])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 3, 'State', N'TX')
--Get a list of the "Fields" (Columns)
DECLARE @DynamicColumns AS VARCHAR(max)
SELECT @DynamicColumns = COALESCE(@DynamicColumns + ', ', '')
+ Quotename(Caption)
FROM (SELECT DISTINCT Caption, Position
FROM zEaAttributes
) AS FieldList
ORDER BY Position
--Build the Dynamic Pivot Table Query
DECLARE @FinalTableStruct AS NVARCHAR(max)
SET @FinalTableStruct = 'SELECT ' + @DynamicColumns +
' FROM zEAValues x PIVOT ( MAX( Value ) FOR Caption IN ('
+ @DynamicColumns + ') ) p '
EXECUTE(@FinalTableStruct)
解决方案
推荐阅读
- c# - 安装后将 wpf 应用程序编译为 x64 失败
- android - Android Firebase 数据库混淆
- spring-boot - 安全拦截器不排除 Spring Boot 应用程序中的资源文件夹
- python - 将来自不同站点的数据附加到 Pandas
- python - 如何根据几个参数在python中对字典进行排序?
- google-sheets - 如何根据国家下拉列表提供正确的国家代码
- vue.js - 如何在 Vue 中使用重复的命名槽
- python - 获取字典值作为列表
- objective-c - NSTask 在 OSX High Sierra 上因 EXC_SOFTWARE 异常而崩溃
- angular - Systemjs 捆绑包