2010-02-17 6 views
8

j'ai une requête simple comme ça ..Pivot - SQL - valeurs de sous-requête

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 simple pivot me donne

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; 

Donne-moi

Cost_Sorted_By_Production_Days 0      1      2      3      4 

AverageCost     5.0885    223.88    359.1082    NULL     949.4105 

Mais les valeurs dans la requête de pivot sont hardcode .. Je veux obtenir ces valeurs d'une sous-requête ..

select DaysToManufacture FROM Production.Product GROUP BY DaysToManufacture; 

Mais le pivot ne me laisse pas obtenir les valeurs de la sous-requête, Y at-il un moyen de le faire autre que d'écrire une requête générée dynamiquement?

Répondre

5

Non. Cela ne peut être fait qu'en utilisant une requête dynamique. Je serais vraiment intéressé de savoir si il y a un moyen.

Il existe quelques exemples qu'un Google search trouvé rapidement en utilisant COALESCE pour créer la liste des colonnes. Cependant je préfère créer la liste des colonnes en utilisant STUFF. Cependant, j'ai trouvé cet article à propos de l'utilisation CTE's and dynamic pivots qui peut être également utile

+0

Merci Ahmad. Je pense que l'idée de Coalesce est plutôt sympa dans mon cas. Même si ce n'est pas une réponse directe, je vous donne vote pour cela;) –

1

Pour obtenir les valeurs de la sous-requête, nous pouvons utiliser une requête dynamique. J'ai fait des recherches et trouvé une solution.

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) 

Merci à .NET Technologies