यह काम करना चाहिए:
WITH Sales AS (
SELECT
S.SaleID,
S.SoldBy,
S.SalePrice,
S.Margin,
S.Date,
I.SalePrice,
I.Category
FROM
dbo.Sale S
INNER JOIN dbo.SaleItem I
ON S.SaleID = I.SaleID
)
SELECT *
FROM
Sales
PIVOT (Max(SalePrice) FOR Category IN (Books, Printing, DVD)) P
;
या वैकल्पिक रूप से:
SELECT
S.SaleID,
S.SoldBy,
S.SalePrice,
S.Margin,
S.Date,
I.Books,
I.Printing,
I.DVD
FROM
dbo.Sale S
INNER JOIN (
SELECT *
FROM
(SELECT SaleID, SalePrice, Category FROM dbo.SaleItem) I
PIVOT (Max(SalePrice) FOR Category IN (Books, Printing, DVD)) P
) I ON S.SaleID = I.SaleID
;
इनका एक ही परिणाम सेट है और वास्तव में क्वेरी ऑप्टिमाइज़र द्वारा समान व्यवहार किया जा सकता है, लेकिन संभवतः नहीं। बड़ा अंतर तब काम आता है जब आप Sale
. पर शर्तें लगाना शुरू करते हैं तालिका—आपको परीक्षण करना चाहिए और देखना चाहिए कि कौन सी क्वेरी बेहतर काम करती है।
नोट:PIVOT
. का उपयोग करते समय यह महत्वपूर्ण है कि केवल कॉलम जो परिणामी आउटपुट का हिस्सा होना चाहिए, उपलब्ध हैं। यही कारण है कि उपरोक्त दो प्रश्नों में अतिरिक्त व्युत्पन्न तालिका उपश्रेणियाँ हैं (SELECT ...)
ताकि केवल विशिष्ट कॉलम ही सामने आएं। PIVOT
. द्वारा देखे जाने के लिए उपलब्ध सभी कॉलम जो पिवट एक्सप्रेशन में सूचीबद्ध नहीं हैं, उन्हें परोक्ष रूप से समूहीकृत किया जाएगा और अंतिम आउटपुट में शामिल किया जाएगा। यह संभवत:वह नहीं होगा जो आप चाहते हैं।
हालांकि, क्या मैं सुझाव दे सकता हूं कि आप प्रेजेंटेशन लेयर में पिवोटिंग करें? यदि, उदाहरण के लिए, आप एसएसआरएस का उपयोग कर रहे हैं तो मैट्रिक्स नियंत्रण का उपयोग करना काफी आसान है जो आपके लिए सभी पिवोटिंग करेगा। यह सबसे अच्छा है, क्योंकि तब यदि आप एक नया Category
जोड़ते हैं , आपने अपने सभी SQL कोड को संशोधित नहीं किया होगा!
स्तंभ नामों को पिवट करने के लिए गतिशील रूप से खोजने का एक तरीका है, लेकिन इसमें गतिशील SQL शामिल है। मैं वास्तव में इसे सबसे अच्छे तरीके के रूप में अनुशंसा नहीं करता, हालांकि यह संभव है।
दूसरा तरीका जो सकता काम इस क्वेरी को प्रीप्रोसेस करना होगा—अर्थात् Category
पर एक ट्रिगर सेट करना तालिका जो मौजूद सभी मौजूदा श्रेणियों को शामिल करने के लिए एक दृश्य को फिर से लिखती है। यह मेरे द्वारा बताई गई कई अन्य समस्याओं का समाधान करता है, लेकिन फिर से, प्रस्तुति परत का उपयोग करना सबसे अच्छा है।
नोट :यदि आपके कॉलम नाम (जो पहले मान थे) में रिक्त स्थान हैं, संख्याएं हैं या किसी संख्या से शुरू होते हैं, या अन्यथा मान्य पहचानकर्ता नहीं हैं, तो आपको उन्हें वर्ग कोष्ठक के साथ उद्धृत करना होगा जैसा कि PIVOT (Max(Value) FOR CategoryId IN ([1], [2], [3], [4])) P
. वैकल्पिक रूप से, आप मानों को PIVOT
. पर पहुंचने से पहले संशोधित कर सकते हैं कुछ अक्षरों को जोड़ने या रिक्त स्थान को हटाने के लिए क्वेरी का हिस्सा, ताकि कॉलम सूची को भागने की आवश्यकता न हो। इस पर आगे पढ़ने के लिए पहचानकर्ताओं . के नियमों को देखें SQL सर्वर में।