2010-02-17 31 views
8

que tienen una consulta simple como esto ..Pivote - SQL - los valores de la subconsulta

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 pivote sencilla me

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; 

da Me da

Cost_Sorted_By_Production_Days 0      1      2      3      4 

AverageCost     5.0885    223.88    359.1082    NULL     949.4105 

Pero los valores en la consulta dinámica son hardcode ... Quiero obtener esos valores de una sub consulta ...

select DaysToManufacture FROM Production.Product GROUP BY DaysToManufacture; 

Pero el pivote no me permite obtener los valores de la subconsulta, ¿hay alguna manera de hacer esto que no sea escribir una consulta generada dinámicamente?

Respuesta

5

No. Esto solo se puede hacer usando una consulta dinámica. Estaría realmente interesado en descubrir si hay una manera.

Hay algunos ejemplos que encontraron Google search rápido usando COALESCE para crear la lista de columnas. Sin embargo, prefiero crear la lista de columnas usando STUFF. Sin embargo, me encontré este artículo sobre el uso CTE's and dynamic pivots que puede ser de assitance así

+0

Gracias Ahmad. Creo que la idea de Coalesce es algo muy bueno en mi caso. Aunque no es una respuesta directa, te doy tu voto por esto;) –

1

Para obtener los valores de la sub consulta que podemos utilizar de consulta dinámica. Hice algunas investigaciones y encontré una solución.

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) 

Gracias a .NET Technologies

Cuestiones relacionadas