sql-server - 将行值作为列添加到现有表
问题描述
对我来说,答案似乎在于 PIVOT 和动态 SQL 中的某个地方,但我无法将这些部分放在一起。我有下表。
FieldId InternalFieldName FieldLabel
1 RepairableSpare_1 CField0
6 Equipment_6 CField1
7 Equipment_7 CField2
8 Equipment_8 CField3
9 Equipment_9 CField4
我需要将 FieldLabel 列中的值作为它们自己的列添加到另一个表中。
最终目标是:
OtherTableID OtherTableColumnA CField0 CField1 CField2 CField3 CField4
ID1 ColumnValue VALUE VALUE VALUE VALUE VALUE
我有第三个表,可用于填充这些 CField 列中的 VALUES,我只是不知道如何将它们作为列在 OtherTable 中。
编辑
自定义字段表
FieldId InternalFieldName FieldLabel
6 Equipment_6 CustomField1
7 Equipment_7 CustomField2
8 Equipment_8 CustomField3
9 Equipment_9 CustomField4
设备表
EquipmentId EquipmentNo
7362 ..12
8696 ..12_COPY2
所需表
EquipmentId EquipmentNo CustomField1 CustomField2 CustomField3 CustomField4
7362 ..12
8696 ..12_COPY2
重要说明,自定义字段的数量不是静态的。
编辑2
我以为我可以从某个角度弄清楚,但看起来那不是(大喊 D-shih 坚持我)的情况。下面我包含了我认为我可以自己弄清楚的另一个我需要使用的表。
我有 3 张桌子:
自定义字段表
FieldId InternalFieldName FieldLabel
6 Equipment_6 CustomField1
7 Equipment_7 CustomField2
8 Equipment_8 CustomField3
9 Equipment_9 CustomField4
自定义字段关系表
FieldValueId FieldId EquipmentId FieldValue
66 6 7431 True
67 7 7431 1900-01-01
68 8 7431 1900-01-01
69 9 7431 NULL
设备表
EquipmentId EquipmentNo
7431 ..12
所需表
EquipmentId EquipmentNo CustomField1 CustomField2 CustomField3 CustomField4
7431 ..12 True 1900-01-01 1900-01-01 NULL
解决方案
我认为您可以尝试使用CROSS APPLY
条件聚合函数。
并通过动态 SQL 执行。
CREATE TABLE CustomField(
FieldId INT,
InternalFieldName VARCHAR(50),
FieldLabel VARCHAR(50)
);
INSERT INTO CustomField VALUES (6,'Equipment_6','CustomField1');
INSERT INTO CustomField VALUES (7,'Equipment_7','CustomField2');
INSERT INTO CustomField VALUES (8,'Equipment_8','CustomField3');
INSERT INTO CustomField VALUES (9,'Equipment_9','CustomField4');
CREATE TABLE Equipment(
EquipmentId INT,
EquipmentNo VARCHAR(50)
);
INSERT INTO Equipment VALUES (7362,'..12');
INSERT INTO Equipment VALUES (8696,'..12_COPY2');
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',max(case when FieldLabel = ''' + FieldLabel + ''' then InternalFieldName end) ' + QUOTENAME(FieldLabel)
FROM CustomField
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @query = 'SELECT EquipmentId,EquipmentNo,'+@cols+'
FROM
(
SELECT *
FROM CustomField
) ta CROSS APPLY
(
SELECT *
FROM Equipment
) tb
GROUP BY EquipmentId,
EquipmentNo
'
EXECUTE(@query)
如果你想让CustomField
它成为空字符串,你只需修改case when
SET @cols = STUFF((SELECT distinct ',max(case when FieldLabel = '''' then InternalFieldName end) ' + QUOTENAME(FieldLabel)
FROM CustomField
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
推荐阅读
- reactjs - 创建 React App 构建无法正常工作
- java - Java vs PHP - 方法参数中的引用
- wordpress - 在 allTribeEvents(事件日历)中显示 ACF 查询
- python - 如何使用线性回归模型生成单个预测值?
- vue.js - 在 vue.js 的 UL 中渲染 LI。有隐形标签吗?
- javascript - 在 Svelte onMount 回调中使用流星数据订阅错误
- java - Java regex 不会查找第一个以外的单词
- c# - .Net Core 3.1 HttpClient Headers.TryAddWithoutValidation 不工作
- eclipse - 有没有办法在 Eclipse 中删除 Maven 启动配置?
- go - AppEngine 部署找不到 Go 包