2010-02-17 54 views
8

值我有这样一个简单的查询..透视 - SQL - 从子查询

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 

一个简单的旋转给我

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; 

给我

Cost_Sorted_By_Production_Days 0      1      2      3      4 

AverageCost     5.0885    223.88    359.1082    NULL     949.4105 

但值在枢轴查询硬编码..我想从一个子查询中获得这些值..

select DaysToManufacture FROM Production.Product GROUP BY DaysToManufacture; 

但是,pivot不让我从子查询中获取值,除了编写动态生成的查询之外,有没有其他方法可以做到这一点?

回答

5

不可以。只能使用动态查询完成此操作。如果有办法,我会非常感兴趣的。

有一些快速Google search使用COALESCE创建列列表的示例。不过,我更愿意使用STUFF来创建列的列表。然而,我确实发现这篇文章有关使用CTE's and dynamic pivots,这可能也是相关的

+0

感谢艾哈迈德。我认为Coalesce的想法对我而言非常酷。即使这不是一个直接的答案,我给你对此的投票;) –

1

要从子查询中获取值,我们可以使用动态查询。我做了一些研究并找到了解决方案。

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) 

由于.NET Technologies