2015-06-19 2 views
0

Это мой SQL скрипт для поворотаPivoting в SQL Server 2008

DECLARE @CanvassQuery AS NVARCHAR(MAX) 
DECLARE @SupplierName AS NVARCHAR(MAX) 

SELECT 
    @SupplierName= ISNULL(@SupplierName + ',','') + QUOTENAME(SupplierName) 
FROM 
    (SELECT DISTINCT SupplierName 
    FROM dpiItemCS_Detailed) AS Supplier 

SET @CanvassQuery = N'SELECT ItemDescription, ' + @SupplierName + ' 
         FROM dpiItemCS_Detailed 
         PIVOT(SUM(UnitCost) FOR SupplierName IN (' + @SupplierName + ')) AS CanvassTable' 

EXEC sp_executesql @CanvassQuery 

Выход является

+-------------+-----------+------------+-----------+ 
| Description | Supplier1 | Supplier2 | Supplier3 | 
+-------------+-----------+------------+-----------+ 
| Item 1  | 28.25  | null  | null  | 
| Item 1  | null  | 28.50  | null  | 
| Item 1  | null  | null  | 28.75  | 
+-------------+-----------+------------+-----------+ 

Я хочу, чтобы мой выход будет

+-------------+-----------+-----------+-----------+ 
| Description | Supplier1 | Supplier2 | Supplier3 | 
+-------------+-----------+-----------+-----------+ 
| Item 1  | 28.25  | 28.50  | 28.75  | 
+-------------+-----------+-----------+-----------+ 

Что такое правильный SQL заявление для поворота для получения этого вывода?

ответ

1

Не видя вашей структуры таблицы, я предполагаю, что у вас есть столбец в dpiItemCS_Detailed, который является уникальным (может быть, столбцом идентификатора), который используется при группировке PIVOT. Чтобы исправить это, вы захотите использовать подзапрос в вашем коде PIVOT. Код должен быть:

DECLARE @CanvassQuery AS NVARCHAR(MAX) 
DECLARE @SupplierName AS NVARCHAR(MAX) 

SELECT 
    @SupplierName= ISNULL(@SupplierName + ',','') + QUOTENAME(SupplierName) 
FROM 
    (SELECT DISTINCT SupplierName 
    FROM dpiItemCS_Detailed) AS Supplier 

SET @CanvassQuery = N'SELECT ItemDescription, ' + @SupplierName + ' 
         FROM 
         (
         SELECT ItemDescription, UnitCost, SupplierName 
         FROM dpiItemCS_Detailed 
         ) d 
         PIVOT(SUM(UnitCost) 
         FOR SupplierName IN (' + @SupplierName + ')) AS CanvassTable' 

EXEC sp_executesql @CanvassQuery 

При использовании PIVOT, вы только хотите, чтобы включить столбцы, необходимые для окончательного списка выбора и агрегации поворотной в наборе данных - в том числе других столбцов потенциально может исказить результат.