首页 > 解决方案 > 将行值作为列添加到现有表

问题描述

对我来说,答案似乎在于 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

标签: sql-servertsql

解决方案


我认为您可以尝试使用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)

sqlfiddle


如果你想让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,'');

sqlfiddle


推荐阅读