2010-02-17 22 views
8

Ho una semplice query come questa ..Pivot - SQL - valori da SubQuery

USE AdventureWorks; 
GO 

SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost 
FROM Production.Product 
GROUP BY DaysToManufacture; 



DaysToManufacture AverageCost 
0     5.0885 
1     223.88 
2     359.1082 
4     949.4105 

Un semplice perno mi

SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4] 
FROM 
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable 
PIVOT 
( 
AVG(StandardCost) 
FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) 
) AS PivotTable; 

dà mi dà

Cost_Sorted_By_Production_Days 0      1      2      3      4 

AverageCost     5.0885    223.88    359.1082    NULL     949.4105 

Ma i valori in pivot query sono hardcode. Voglio ottenere quei valori da una subquery ..

Ma pivot non mi consente di ottenere valori dalla sottoquery, Esiste un modo per farlo se non scrivere una query generata dinamicamente?

risposta

5

No. Questo può essere fatto solo utilizzando una query dinamica. Sarei davvero interessato a scoprire anche se c'è un modo.

Ci sono alcuni esempi che un rapido Google search ha trovato utilizzando COALESCE per creare l'elenco di colonne. Tuttavia preferisco creare l'elenco delle colonne usando STUFF. Tuttavia ho trovato questo articolo sull'uso CTE's and dynamic pivots che può essere di assitenza pure

+0

Grazie Ahmad. Penso che l'idea di Coalesce sia abbastanza interessante nel mio caso. Anche se non è una risposta diretta, ti do un voto per questo;) –

1

Per ottenere i valori dalla sottoquery possiamo usare la query dinamica. Ho fatto qualche ricerca e ho trovato una soluzione.

DECLARE @query VARCHAR(4000) 
DECLARE @days VARCHAR(2000) 
SELECT @days = STUFF((SELECT DISTINCT 
         '],[' + ltrim(str(DaysToManufacture)) 
         FROM Product 
         ORDER BY '],[' + ltrim(str(DaysToManufacture)) 
         FOR XML PATH('') 
         ), 1, 2, '') + ']' 

SET @query = 
'SELECT ''AverageCost'' AS Cost_Sorted_By_Production_Days,' + 
@days + 
'FROM (SELECT DaysToManufacture, StandardCost FROM Product) AS SourceTable 
PIVOT 
( 
AVG(StandardCost) 
FOR DaysToManufacture IN (' + @days + ')) AS PivotTable;' 

EXECUTE (@query) 

Grazie a .NET Technologies