Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर क्वेरी:पंक्तियाँ कॉलम बनाती हैं (धुरी?)

पिवोटिंग बहुत कुछ ग्रुपिंग की तरह है। आप इसे 'विशेष प्रभाव' वाले सीमित समूह के रूप में देख सकते हैं। सीमा इस तथ्य में निहित है कि केवल एक समेकित कॉलम हो सकता है। (सामान्य GROUP BY क्वेरी में आपके पास स्वाभाविक रूप से एक से अधिक हो सकते हैं।) और 'विशेष प्रभाव' से मेरा मतलब है, निश्चित रूप से, अन्य स्तंभों में से एक (और, फिर से, केवल एक) कई स्तंभों में परिवर्तित हो जाता है।

एक उदाहरण के रूप में आपके ग्रुप बाय क्वेरी को लेते हैं। आपके पास आउटपुट में तीन कॉलम हैं। उनमें से एक, Count , वह स्तंभ है जिसमें समग्र जानकारी होती है। यह वह है जो एक PIVOT क्वेरी में कई स्तंभों के बीच बिखरा हुआ होगा। एक और कॉलम, Priority , दो अन्य स्तंभों में से एक है जिसके द्वारा परिणामों को समूहीकृत किया जाता है और वह भी जिसे पिवोट करने की आवश्यकता होती है। अंत में, EntryDate कॉलम द्वारा दूसरा ग्रुप है। इसे बस जैसा है वैसा ही रहना चाहिए, क्योंकि यह सीधे धुरी में भाग नहीं लेता है।

आइए अब देखें कि कैसे आपका मुख्य चयन एक सामान्य ग्रुप बाय क्वेरी से एक PIVOT क्वेरी में चरण दर चरण रूपांतरित हो जाता है:

  1. चूंकि ग्रुपिंग एक पिवोट क्वेरी में निहित है, ग्रुप बाय क्लॉज हटा दिया गया है। इसके बजाय, एक PIVOT क्लॉज पेश किया गया है।

  2. Count कॉलम के एक्सप्रेशन को सेलेक्ट क्लॉज से PIVOT क्लॉज में ले जाया जाता है।

  3. Priority . का बंटवारा स्तंभ को PIVOT खंड में परिभाषित किया गया है।

  4. Priority और Count सेलेक्ट क्लॉज में कॉलम को PIVOT क्लॉज में परिभाषित कॉलम की सूची से बदल दिया जाता है।

  5. EntryDate सेलेक्ट क्लॉज में कॉलम अपरिवर्तित रहता है।

और यहाँ परिणामी क्वेरी है, जिसमें ऊपर वर्णित परिवर्तन के प्रत्येक भाग को चिह्नित करने वाली टिप्पणियाँ हैं:

WITH TATH(Priority, EntryDate) AS 
(
    SELECT TH.Priority as Priority, DATEADD(dd, 0, DATEDIFF(dd, 0, entryDate)) as EntryDate
      FROM TicketAssignment TA, TicketHeader TH 
     WHERE TA.TicketID = TH.TicketID   
       AND TA.Company = 'IT'
       AND TA.CurrentRole IN ('SA1B','SA1C','SDA')
) 
SELECT
  convert(varchar(10), EntryDate,103) as EntryDate,                       -- #5
  [0] AS Priority0, [1] AS Priority1, [2] AS Priority2, [3] AS Priority3  -- #4
FROM TATH
PIVOT (                                                                   -- #1
  COUNT(*)                                                                -- #2
  FOR Priority IN ([0], [1], [2], [3])                                    -- #3
) p

/*  -- your original main query, for comparison
SELECT
  Priority,                                                               -- #4
  convert(varchar(10),                                                    -- #5
  EntryDate,103) as EntryDate, COUNT(*) AS Count                          -- ##2&4
FROM TATH 
GROUP BY Priority, EntryDate                                              -- #1
*/

PIVOT क्लॉज में कॉलम सूची पर एक अतिरिक्त नोट है। सबसे पहले, आपको यह समझना चाहिए कि SQL क्वेरी के परिणामी सेट को स्तंभों की संख्या और उनके नामों के संदर्भ में तय किया जाना चाहिए। इसका मतलब है कि आपको उन सभी रूपांतरित स्तंभों की स्पष्ट रूप से गणना करनी चाहिए जिन्हें आप आउटपुट में देखना चाहते हैं। नाम पिवट किए जा रहे स्तंभ के मानों से लिए गए हैं लेकिन उन्हें नाम . के रूप में निर्दिष्ट किया जाना चाहिए , मूल्यों के रूप में नहीं। इसलिए आप सूचीबद्ध संख्याओं के चारों ओर वर्गाकार कोष्ठक देख सकते हैं। चूँकि संख्याएँ स्वयं नियमित पहचानकर्ताओं के नियमों , उन्हें सीमांकित किया जाना चाहिए।

आप यह भी देख सकते हैं कि आप किसी अन्य कॉलम या एक्सप्रेशन की तरह ही सेलेक्ट क्लॉज में अन्य पिवोटेड कॉलम भी देख सकते हैं। तो, अंत में, आपको अर्थहीन 0 . के साथ समाप्त होने की आवश्यकता नहीं है , 1 आदि पहचानकर्ता और इसके बजाय आप उन स्तंभों को अपनी पसंद का कोई भी नाम निर्दिष्ट कर सकते हैं।

यदि आप चाहते हैं कि पिवोटेड कॉलम की संख्या और/या नाम गतिशील हों, तो आपको क्वेरी को गतिशील रूप से बनाना होगा, यानी पहले नामों को इकट्ठा करना होगा, फिर उन्हें एक स्ट्रिंग में शामिल करना होगा जिसमें बाकी कॉलम शामिल हों। क्वेरी करें और अंतिम क्वेरी को EXEC () . के साथ लागू करें या EXEC sp_executesql . आप इस साइट को खोज कर सकते हैं गतिशील पिवोटिंग के बारे में अधिक जानकारी के लिए।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tsql एक स्ट्रिंग के अंदर की अंतिम घटना

  2. जब डेटाबेस अपडेट किया गया है तो मैं अपने प्रोग्राम को कैसे सूचित कर सकता हूं?

  3. गेटडेट का आउटपुट बदलना

  4. SQL सर्वर फ़ेलओवर क्लस्टर में सिस्टम डेटाबेस ले जाएँ

  5. SQL सर्वर तालिका में कंप्यूटेड कॉलम कैसे जोड़ें - SQL सर्वर / T-SQL ट्यूटोरियल भाग 47