Транспонирование строк из одной таблицы на основе значений столбцов в другой таблице - PullRequest
0 голосов
/ 25 января 2019

Я задал похожий вопрос [здесь]: Перемещение групп строк с одинаковым идентификатором в другую таблицу , но я не хочу записывать каждую строку для каждого имени атрибута.Я хочу иметь возможность взять строки в одном столбце из TABLE1 (скажем, есть 50 уникальных строк) и эффективно их транспонировать в TABLE2.Это небольшой пример таблицы ATTR_NME (имен атрибутов) в одном столбце:

  ID          ATTR_NME          ATTR_VAL
 1000           UPC            00015582981001
 1000          Price              15.99
 1000          Brand               Oreo
 1005           UPC            00038762291010
 1005          Price               12.50
 1005          Brand             Sargento
 1010           UPC            00198872499000
 1010          Price               4.99
 1010          Brand               Olay

Таким образом, ID, UPC, Price и Brand должны быть собственными столбцами с ATTR_VAL в качестве строк данных.Вот различие между этим вопросом и моим предыдущим: скажем, у меня есть таблица с 50 различными значениями ATTR_NME, я хочу использовать этот столбец данных со всеми этими именами атрибутов для создания новой транспонированной таблицы без необходимости записывать следующие 50 раз дляразные атрибуты:

MAX(CASE WHEN ATTR_NME = 'UPC' THEN ATTR_VAL END) AS UPC

Я пытался объявить переменную для строк в столбце ATTR_NME следующим образом:

DECLARE @itm varchar(100);
SET @itm = (
      SELECT ATTR_NME
      FROM TABLE1
      );
SELECT ID,
       MAX(CASE WHEN ATTR_NME = @itm THEN ATTR_VAL END) AS [@itm]
FROM TABLE1
GROUP BY ID;

Но это не сработало по нескольким причинам;одна из них - это то, что я хотел обернуть агрегатную функцию вокруг ATTR_NME, где я установил @itm (но тогда я получил только одно имя атрибута).Это также не пометило / назвало колонку, как я хотел.Можно ли вообще делать то, что я хочу?Если да, то как?ТИА.

1 Ответ

0 голосов
/ 25 января 2019

Вы говорите о Pivot?

Если вам нужно pivot эту таблицу, вы не можете не поставить ATTR_NME 50 раз в приведенном ниже запросе (см. Комментарий)

WITH A
AS
(
 SELECT '1000' as ID,          'UPC  ' as ATTR_NME,          '00015582981001' as ATTR_VAL
 UNION ALL SELECT '1000' as ID,          'Price' as ATTR_NME,          '15.99           ' as ATTR_VAL
 UNION ALL SELECT '1000' as ID,          'Brand' as ATTR_NME,          'Oreo            ' as ATTR_VAL
 UNION ALL SELECT '1005' as ID,          'UPC  ' as ATTR_NME,          '00038762291010' as ATTR_VAL
 UNION ALL SELECT '1005' as ID,          'Price' as ATTR_NME,          '12.50           ' as ATTR_VAL
 UNION ALL SELECT '1005' as ID,          'Brand' as ATTR_NME,          'Sargento        ' as ATTR_VAL
 UNION ALL SELECT '1010' as ID,          'UPC  ' as ATTR_NME,          '00198872499000' as ATTR_VAL
 UNION ALL SELECT '1010' as ID,          'Price' as ATTR_NME,          '4.99            ' as ATTR_VAL
 UNION ALL SELECT '1010' as ID,          'Brand' as ATTR_NME,          'Olay            ' as ATTR_VAL
)
SELECT *
FROM A
PIVOT
  (MAX(ATTR_VAL) FOR ATTR_NME in ([Price],[Brand],[UPC]) ) -- here you need to put all the 50 ATTR_NAME
  as PIVOTTABLE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...