2010-02-17 17 views
8

से मानों मैं इस तरह एक सरल प्रश्न हैं ..धुरी - एसक्यूएल - सबक्वेरी

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; 

लेकिन पिवट मुझे सबक्वायरी से मूल्य नहीं मिलने देता है, क्या गतिशील रूप से जेनरेट की गई क्वेरी लिखने के अलावा ऐसा करने का कोई तरीका है?

उत्तर

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

संबंधित मुद्दे