Добавить значения строк в виде столбцов в существующую таблицу - PullRequest
0 голосов
/ 07 сентября 2018

Кажется, что ответ для меня лежит где-то в 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, я просто не могу понять, как получить их в виде столбцов в OtherTable.

EDIT

Я приложил изображение таблиц, с которыми я работаю, и текстовую информацию ниже.enter image description here

Таблица 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

Важное примечаниеколичество пользовательских полей не является статическим.

EDIT2

Я думал, что смогу понять это с определенной точки, но похоже, что это был не тот случай (большой крик Д-ши за то, что он остался со мной).Ниже я включил другую таблицу, с которой мне нужно поработать, и я подумал, что смогу разобраться сам.

У меня есть 3 таблицы:

Таблица пользовательских полей

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

1 Ответ

0 голосов
/ 07 сентября 2018

Я думаю, вы можете попытаться использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...