Динамический SQL для генерации имен столбцов?

У меня есть запрос, где я пробую значения строки центра в имена столбцов, и в настоящее время я использую SUM(Case...) As 'ColumnName' операторы, как так:

SELECT
SKU1,
SUM(Case When Sku2=157 Then Quantity Else 0 End) As '157',
SUM(Case When Sku2=158 Then Quantity Else 0 End) As '158',
SUM(Case When Sku2=167 Then Quantity Else 0 End) As '167'
FROM
OrderDetailDeliveryReview
Group By
OrderShipToID,
DeliveryDate,
SKU1 

Вышеупомянутый запрос работает отлично и дает мне точно, в чем я нуждаюсь. Однако я выписываю SUM(Case... операторы вручную на основе результатов следующего запроса:

Select Distinct Sku2 From OrderDetailDeliveryReview 

Есть ли путь, с помощью T-SQL в хранимой процедуре, которую я могу динамично генерировать SUM(Case... операторы от Select Distinct Sku2 From OrderDetailDeliveryReview запросить и затем выполнить получающийся код SQL?

9
задан Ben McCormack 31 March 2010 в 16:48
поделиться

2 ответа

Отвечая на многие из этих вопросов за эти годы путем генерации динамического сводного SQL из метаданных, взгляните на следующие примеры:

SQL Dynamic Pivot - как упорядочить столбцы

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

В каком SQL-запросе или представлении будут отображаться «динамические столбцы»

Как выполнить поворот по атрибутам столбца XML в T-SQL

Как применить принцип DRY к операторам SQL, которые сводятся к месяцам

В вашем конкретном случае (с использованием сводной таблицы ANSI вместо функции PIVOT SQL Server 2005):

DECLARE @template AS varchar(max)
SET @template = 'SELECT 
SKU1
{COLUMN_LIST}
FROM
OrderDetailDeliveryReview
Group By
OrderShipToID,
DeliveryDate,
SKU1
'

DECLARE @column_list AS varchar(max)
SELECT @column_list = COALESCE(@column_list, ',') + 'SUM(Case When Sku2=' + CONVERT(varchar, Sku2) + ' Then Quantity Else 0 End) As [' + CONVERT(varchar, Sku2) + '],' 
FROM OrderDetailDeliveryReview
GROUP BY Sku2
ORDER BY Sku2

Set @column_list = Left(@column_list,Len(@column_list)-1)

SET @template = REPLACE(@template, '{COLUMN_LIST}', @column_list)

EXEC (@template)
11
ответ дан 4 December 2019 в 14:27
поделиться

Я знаю, что поисковая система SO не идеальна, но на ваш вопрос был дан ответ в Данные столбца PIVOT SQL Server .
См. Также Создание запросов кросс-таблиц и сводных таблиц в SQL .

2
ответ дан 4 December 2019 в 14:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: