Поворот таблицы на два столбца значений - PullRequest
0 голосов
/ 07 мая 2019

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

CREATE TABLE #Products (
  product VARCHAR(30),
  market_year INT,
  value INT,
  description varchar(20));

INSERT INTO #Products VALUES('Corn', 2003, 100, 'bad');
INSERT INTO #Products VALUES('Beer', 2003, 200, 'not so bad');
INSERT INTO #Products VALUES('Beef', 2003, 150, 'good');

INSERT INTO #Products VALUES('Corn', 2004, 10, 'doo');
INSERT INTO #Products VALUES('Beer', 2004, 20, 'foo');
INSERT INTO #Products VALUES('Beef', 2004, 10, 'bar');

, которая выглядит следующим образом:

SELECT * FROM #Products p;

product market_year value   description
Corn        2003    100     bad
Beer        2003    200     not so bad
Beef        2003    150     good
Corn        2004    10      doo
Beer        2004    20      foo
Beef        2004    10      bar

Нужный результат должен выглядеть следующим образом:

market_year |corn_value |corn_description | beer_value | beer_description |beef_value | beef_description
2003        | 100       |bad              | 150        | NOT so bad       |150        | good
2003        | 10        |doo              | 15         | foo              |15         | bar

Я знаюЯ мог бы сделать это с помощью двух отдельных операторов с одним стержнем на market_year и присоединить их к market_year, но для этого нужно было бы прочитать эту таблицу дважды.Есть ли более элегантный способ решить эту проблему?(моя таблица содержит приблизительно 7 миллионов записей, разделенных на 70 столбцов, которые необходимо вернуть к 140 столбцам)

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Можно попробовать использовать динамический пивот

объявляет две переменные @CONTENT для представления сводного SQL-запроса CASE WHEN с помощью MAX затем используйте @sql для подключения SQL-запроса и execute, чтобы выполнить этот SQL-файл динамически.

DECLARE @SQL VARCHAR(MAX),@CONTENT VARCHAR(MAX)
SELECT  @CONTENT = STUFF((
    SELECT ', '+'MAX(CASE WHEN product = '''+ product + ''' THEN [VALUE] END) AS '''+product+'_value'',
        MAX(CASE WHEN product = '''+ product + ''' THEN [description] END) AS '''+product+'_value'''
    FROM #Products 
    FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
  ,1,2,'')

SELECT @SQL = 'SELECT market_year,' + @CONTENT + ' FROM #Products GROUP BY market_year';
execute(@SQL)

sqlfiddle

0 голосов
/ 07 мая 2019

выберите * от ( выберите market_year, продукт, стоимость из #products p ) src стержень ( сумма (стоимость) для продукта в (пиво, ком, говядина) ) piv;

попробуйте, это поможет вам понять

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