对于我来说,答案似乎就在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中的列获取。
CustomField表
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
重要说明,自定义字段的数量不是静态的。
我以为我可以从某个角度弄清楚,但这似乎不是(D-shih大声喊叫坚持我)。在下面,我列出了我需要使用的其他表格,我认为自己可以弄清楚自己。
我有3张桌子:
CustomField表
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
7431 ..12
所需表
EquipmentId EquipmentNo CustomField1 CustomField2 CustomField3 CustomField4
7431 ..12 True 1900-01-01 1900-01-01 NULL
答案 0 :(得分:0)
我认为您可以尝试将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,'');