2010-02-17 4 views
8

У меня есть простой запрос, как это ..Pivot - 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 

Но значения в сводном запросе - это hardcode. Я хочу получить эти значения из подзапроса.

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

Смежные вопросы