Sql server 将行值作为列添加到现有表中
对我来说,答案似乎就在PIVOT和DynamicSQL中的某个地方,但我无法将它们组合在一起。我有下表Sql server 将行值作为列添加到现有表中,sql-server,tsql,Sql Server,Tsql,对我来说,答案似乎就在PIVOT和DynamicSQL中的某个地方,但我无法将它们组合在一起。我有下表 FieldId InternalFieldName FieldLabel 1 RepairableSpare_1 CField0 6 Equipment_6 CField1 7 Equipment_7 CField2 8 Equipment_8 CField3 9 Equipment_9
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列中的值,但我不知道如何将它们作为其他表中的列
编辑
我在下面附上了我正在处理的表格的图片和文本信息。
自定义字段表
FieldId InternalFieldName FieldLabel
6 Equipment_6 CustomField1
7 Equipment_7 CustomField2
8 Equipment_8 CustomField3
9 Equipment_9 CustomField4
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
7431 ..12
所需表格
EquipmentId EquipmentNo CustomField1 CustomField2 CustomField3 CustomField4
7362 ..12
8696 ..12_COPY2
EquipmentId EquipmentNo CustomField1 CustomField2 CustomField3 CustomField4
7431 ..12 True 1900-01-01 1900-01-01 NULL
重要提示:自定义字段的数量不是静态的
编辑2
我以为我可以从某一点上找到答案,但看起来这并不是(因为D-shih坚持我而大声疾呼)的情况。下面我已经包括了另一张我需要处理的表格,我想我可以自己弄清楚
我有三张桌子:
自定义字段表
FieldId InternalFieldName FieldLabel
6 Equipment_6 CustomField1
7 Equipment_7 CustomField2
8 Equipment_8 CustomField3
9 Equipment_9 CustomField4
FieldId InternalFieldName FieldLabel
6 Equipment_6 CustomField1
7 Equipment_7 CustomField2
8 Equipment_8 CustomField3
9 Equipment_9 CustomField4
CustomFieldRelationshipTable
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
7362 ..12
8696 ..12_COPY2
EquipmentId EquipmentNo
7431 ..12
所需表格
EquipmentId EquipmentNo CustomField1 CustomField2 CustomField3 CustomField4
7362 ..12
8696 ..12_COPY2
EquipmentId EquipmentNo CustomField1 CustomField2 CustomField3 CustomField4
7431 ..12 True 1900-01-01 1900-01-01 NULL
我认为您可以尝试将
交叉应用
与条件聚合函数一起使用
并通过动态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
成为空字符串,只需在
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,'');
样本数据和预期结果之间有什么关系?@D-Shih样本数据和预期结果之间没有直接关系。基本结构是:表A表B表C我需要表A中的行,作为列添加到表C中,这些列将由表B中的数据填充。表B与表A和表C有关系。请欣赏响应,但不完全如此。交叉应用将为表B中的每一行添加表B中的每一列。我需要从FieldLabel列中获取值(有关表结构,请参阅原始帖子),并将这些值作为列添加到另一个表中。因此,这个过程的一部分,在逻辑上(如果不是语法上)是一个表的轴,然后将该结果添加到另一个表中。@MPJ567好的,您能提供一些示例数据并期望得到问题的结果吗?这可以让问题更清楚。请参见编辑,并感谢您的持续帮助。这非常完美,尽管不幸的是,我无法真正理解如何从您提供给我的内容到我的最终答案。我再次进行了编辑,包括我打算从中提取数据的关系表中的信息。如果你还有耐心帮我,我会很感激的。