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

SQL में साल दर साल ग्रुप कैसे करें

समस्या:

आप अपने डेटा को वर्ष के अनुसार समूहित करना चाहते हैं।

उदाहरण I:

आपके डेटा में एक कॉलम है transaction_date . इसमें एक तारीख होती है। आप अपने सभी डेटा को वर्ष के अनुसार समूहित करना चाहते हैं और प्रत्येक वर्ष अर्जित कुल धन की गणना करना चाहते हैं।

data तालिका इस तरह दिखती है:

लेनदेन_तिथि पैसा
2018-03-25 1700
2019-09-12 100
2018-07-14 1200
2018-01-05 400
2019-06-08 2000
2020-03-06 1500

समाधान 1 (वर्ष और अर्जित धन को प्रदर्शित करना):

SELECT
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY EXTRACT(year FROM transaction_date);

नतीजा यह है:

वर्ष पैसा_कमाया
2020 1500
2019 2100
2018 3300

समाधान 2 (पूर्ण तिथि, वर्ष और संबंधित वर्ष में अर्जित धन को प्रदर्शित करना):

SELECT
  transaction_date AS transaction_date,
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) OVER(PARTITION BY EXTRACT(year FROM transaction_date)) AS money_earned
FROM data;

नतीजा यह है:

लेनदेन_तिथि वर्ष पैसा_कमाया
2018-03-25 2018 3300
2018-07-14 2018 3300
2018-01-05 2018 3300
2019-09-12 2019 2100
2019-06-08 2019 2100
2020-03-06 2020 1500

चर्चा:

इस उदाहरण में यह माना जाता है कि आपके पास year नहीं है कॉलम। इसके बजाय आपके पास पूर्ण तिथियों वाला कॉलम है।

सबसे पहले, आपको तिथि से एक वर्ष पुनर्प्राप्त करने की आवश्यकता है। आप EXTRACT(part FROM date) . का उपयोग कर सकते हैं करने का कार्य करते हैं। आपके मामले में, आप वर्ष निकालना चाहते हैं, इसलिए part year है . date वह कॉलम है जिसमें तिथियां होती हैं - transaction_date कॉलम। कॉलम का नाम बदलकर साल-दर-साल करना एक अच्छा विचार है। यदि आप EXTRACT . के बारे में अधिक जानना चाहते हैं कार्य और तिथि से विभिन्न भागों को कैसे पुनर्प्राप्त करें, आप इसे यहां पा सकते हैं।

यदि आप केवल वर्ष और इस वर्ष अर्जित कुल धन प्रदर्शित करना चाहते हैं, तो आप GROUP BY का उपयोग कर सकते हैं . पहला चयनित कॉलम दिनांक से निकाला गया वर्ष है। दूसरा कॉलम कुल कार्य है SUM(money) . क्वेरी के अंत में आपको एक GROUP BY EXTRACT(year FROM transaction_date) की आवश्यकता होती है या, सरल, GROUP BY 1 (since EXTRACT(year FROM transaction_date) पहला कॉलम है।)

यदि आप अधिक कॉलम प्रदर्शित करना चाहते हैं, तो आपको एक विंडो फ़ंक्शन (समाधान 2) की आवश्यकता है। SUM(money) . के बाद आप OVER() लिखें खंड और, चूंकि आप प्रत्येक वर्ष के लिए राशि की गणना करना चाहते हैं, PARTITION BY EXTRACT(year FROM transaction_date) का उपयोग करें इसके अंदर। ध्यान दें कि योग की गणना करते समय आपके पास अभी तक वर्ष कॉलम नहीं है, इसलिए PARTITION BY year काम नहीं करेगा - आपको एक त्रुटि मिलेगी 'column "year" does not exist' . आप इस लेख में विंडो के कार्यों के बारे में अधिक पढ़ सकते हैं।

उदाहरण II:

आपके डेटा में एक कॉलम है year . आप अपने सभी डेटा को इस कॉलम के आधार पर समूहित करना चाहते हैं और प्रत्येक वर्ष अर्जित कुल धन की गणना करना चाहते हैं।

data तालिका इस तरह दिखती है:

<थ>दिन
वर्ष माह पैसा
2018 3 25 1700
2019 9 12 100
2018 7 14 1200
2018 1 5 400
2019 6 8 2000
2020 3 6 1500

समाधान 1 (वर्ष और अर्जित धन को प्रदर्शित करना):

SELECT
  year,
  SUM(money) AS money_earned
FROM data
GROUP BY year;

नतीजा यह है:

वर्ष पैसा_अर्जित
2020 1500
2018 3300
2019 2100

समाधान 2 (वर्ष, माह, दिन और संबंधित वर्ष में अर्जित धन को प्रदर्शित करना):

SELECT
  year,
  month,
  day,
  SUM(money) OVER(PARTITION BY year) AS money_earned
FROM data;

नतीजा यह है:

<थ>दिन
वर्ष माह पैसा_अर्जित
2018 3 25 3300
2018 7 14 3300
2018 1 5 3300
2019 9 12 2100
2019 6 8 2100
2020 3 6 1500

चर्चा:

इस उदाहरण में यह माना जाता है कि आपके पास पहले से ही year है कॉलम।

यदि आप वर्ष और इस वर्ष अर्जित कुल धन प्रदर्शित करना चाहते हैं, तो एक आसान GROUP BY काफी है। यदि आप GROUP BY . की अवधारणा के साथ सहज महसूस नहीं करते हैं , यहां एक नज़र डालें जहां हम इसे समझाते हैं। आप केवल समग्र फ़ंक्शन का उपयोग करते हैं (यहां:SUM ) सही कॉलम के साथ और क्वेरी के अंत में आप year . द्वारा समूहित करते हैं . आप AS . का उपयोग करके कॉलम का नाम बदल सकते हैं एक नए नाम के साथ कीवर्ड।

यदि आप कुछ अन्य कॉलम भी प्रदर्शित करना चाहते हैं तो यह अधिक जटिल है। फिर आपको विंडो फ़ंक्शन (समाधान 2) का उपयोग करके समाधान की आवश्यकता है। आपको उपयुक्त कॉलम के साथ एग्रीगेट फ़ंक्शन का उपयोग करना चाहिए (यहां:SUM(money) ) और OVER() लिखें बाद में खंड। इस क्लॉज में, आपको PARTITION BY . का उपयोग करना चाहिए उस कॉलम के साथ जिसके द्वारा आप समूह बनाना चाहते हैं। इस तरह आपको मिलता है:

SUM(money) OVER(PARTITION BY year)

इस समाधान में, आप GROUP BY . का उपयोग नहीं करते हैं खंड।

आप यहां विंडो फ़ंक्शन के बारे में अधिक पढ़ सकते हैं।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. विस्तारित घटनाओं के साथ घटना हानि को समझना

  2. तालिका भाव के मूल तत्व, भाग 1

  3. क्या आप क्रमबद्ध हैं? टी-एसक्यूएल विंडो ऑर्डरिंग से संबंधित टिप्स

  4. NoSQL में DBA की भूमिका

  5. प्रदर्शन डेटा का उपयोग करके क्षमता नियोजन