Как использовать значение столбца в качестве заголовка столбца? - PullRequest
0 голосов
/ 29 февраля 2012

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

ItemID    PartID   PartName   PartValue
  1         1        N1         v1
  1         2        N2         v2
  1         3        N3         v3
...
  2         1        N1          u1
  2         2        N2          u2
  2         3        N3          u3
...

Могу ли я использовать оператор выбора SQL для получения следующей таблицы?

ItemID    N1    N2    N3 ...
  1       v1    v2    v3 ...
  2       u1    u2    u3 ...
 ...

Проблема в том, что я не знаю, сколько имен деталей, поэтому могут быть также n4, n5, n6 ... поэтому нужно динамически выбирать. Я вижу несколько сводных примеров, но похоже, что их можно использовать, когда я знаю, сколько названий деталей. Если я не знаю, как мне быть с этим? Спасибо!

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

Если вы не можете предварительно определить столбцы в выходных данных, тогда PIVOT не подходит. Вместо этого динамический SQL (которого обычно следует избегать) - это путь вперед.

См. Сводка SQL Server 2005 для неизвестного числа столбцов

1 голос
/ 29 февраля 2012

Ниже было проверено в SQL-Server, но я думаю, что принципы могут быть применены к любой СУБД, которую вы используете.

CREATE TABLE #t (ItemID INT, PartID INT, PartName VARCHAR(2), PartValue VARCHAR(2))
INSERT #t VALUES (1, 1, 'N1', 'V1'), (1, 2, 'N2', 'V2'), (1, 3, 'N3', 'V3'), (2, 1, 'N1', 'V1'), (2, 2, 'N2', 'V2'), (2, 3, 'N3', 'V3')

DECLARE @SQL VARCHAR(MAX)
SELECT  @SQL = ISNULL(@SQL, '') + 
                        ', (    SELECT  PartValue 
                                FROM    #t t' + Rownum + ' 
                                WHERE   t' + Rownum + '.ItemID = t.ItemID
                                AND     t' + Rownum + '.PartName = ''' + PartName + ''' 
                            ) [' + PartName + ']'
FROM    (   SELECT  PartName, CONVERT(VARCHAR, ROW_NUMBER() OVER (ORDER BY PartName)) [RowNum]
            FROM    #t
            GROUP BY PartName
        ) d
SET @SQL = 'SELECT ItemID' + @SQL + ' FROM (SELECT DISTINCT ItemID FROM #t) t'
EXEC (@SQL)

DROP TABLE #t

Примечание. Скорее всего, это станет неэффективным, если у вас много данных и много столбцов

1 голос
/ 29 февраля 2012

Это можно сделать с помощью динамического SQL для построения сводного оператора.Неловко, некрасиво, но работает и может работать достаточно эффективно.Пожалуйста, просмотрите мой первый ответ на этот вопрос для деталей.

...