सरल योग मैं sum() फ़ंक्शन के साथ कर सकता हूं। लेकिन मेरे यहां एक अलग स्थिति है। मेरे पास एक टेबल है विद्यार्थी केवल 2 फ़ील्ड के साथ। उदाहरण के लिए मान लें कि पूरी कक्षा में केवल 1 छात्र है:

CREATE TABLE student
    (`dateOfExam` date, score int)
;
    
INSERT INTO student
    (`dateOfExam`, `score`)
VALUES
    ('2020-05-28',5),
    ('2020-05-29',5),
    ('2020-05-30',10),
    ('2020-06-03',10),
    ('2020-06-05',5),
    ('2020-07-21',20),
    ('2020-07-22',10),
    ('2020-07-28',10)
;

और मेरे पास उन दिनों के लिए उनके स्कोर हैं जब परीक्षाएं रनटाइम में एक और कॉलम के साथ ली गई थीं, जिस महीने परीक्षा आयोजित की गई थी:

क्वेरी है (कल स्टैकओवरफ़्लो से मदद ली):

select date_format(dateOfExam, '%Y-%m') ExamMonth
     , dateOfExam
     , score 
  from student;

नतीजा:

+-----------+------------+-------+
| ExamMonth | dateOfExam | score |
+-----------+------------+-------+
| 2020-05   | 2020-05-28 |     5 |
| 2020-05   | 2020-05-29 |     5 |
| 2020-05   | 2020-05-30 |    10 |
| 2020-06   | 2020-06-03 |    10 |
| 2020-06   | 2020-06-05 |     5 |
| 2020-07   | 2020-07-21 |    20 |
| 2020-07   | 2020-07-22 |    10 |
| 2020-07   | 2020-07-28 |    10 |
+-----------+------------+-------+

मेरी आवश्यकता है कि मैं इस छात्र को हर महीने पुरस्कृत करना चाहता हूं। मैं प्रत्येक व्यक्तिगत महीने के लिए प्रत्येक तिथि के लिए उसका स्कोर जोड़ना जारी रखूंगा और संचित स्कोर राशि के १० तक पहुंचने पर उसे इनाम1 और संचित स्कोर राशि २० तक पहुंचने पर इनाम2 दूंगा। तो अंतिम तालिका इस तरह होनी चाहिए:

+---------------+---------------+-------+---------------+---------------+
| ExamMonth     |  dateOfExam   | Score |    Reward1    |   Reward2     |
+---------------+---------------+-------+---------------+---------------+
|    2020-05    |  2020-05-28   |   5   |               |               |
|               |  2020-05-29   |   5   |       Y       |               |
|               |  2020-05-30   |   10  |               |       Y       |
|---------------|---------------|-------|---------------|---------------|
|    2020-06    |  2020-06-03   |   10  |       Y       |               |
|               |  2020-06-05   |   5   |               |               |
|---------------|---------------|-------|---------------|---------------|
|    2020-7     |  2020-07-21   |   20  |       Y       |       Y       |
|               |  2020-07-22   |   10  |               |               |
|               |  2020-07-28   |   10  |               |               |
+---------------+---------------+-------+---------------+---------------+

इनाम फ़ील्ड बूलियन हो सकते हैं और खाली इनाम पंक्तियों को N या False या जो भी तार्किक लगता है, पर सेट किया जा सकता है। यह मददगार नहीं था: रनिंग योग की गणना करें

कृपया इस उद्देश्य को प्राप्त करने में मेरी सहायता करें। कुछ उपाय सुझाएं।

यहां एक fiddle दिया गया है।

2
Tanzeel 21 सितंबर 2020, 06:57

2 जवाब

सबसे बढ़िया उत्तर

पहले सीटीई में प्रत्येक महीने के स्कोर के रनिंग योग की गणना करें।
फिर अपनी शर्तें लागू करें:

with cte as (
  select date_format(dateOfExam, '%Y-%m') ExamMonth,
         dateOfExam, score, 
         sum(score) over (partition by date_format(dateOfExam, '%Y-%m') order by dateOfExam) total
  from student
)
select ExamMonth, dateOfExam, score, 
       case when sum(total >= 10) over (partition by ExamMonth order by dateOfExam) = 1 then 'Y' end Reward1,
       case when sum(total >= 20) over (partition by ExamMonth order by dateOfExam) = 1 then 'Y' end Reward2
from cte

डेमो देखें।
परिणाम:

> ExamMonth | dateOfExam | score | Reward1 | Reward2
> :-------- | :--------- | ----: | :------ | :------
> 2020-05   | 2020-05-28 |     5 | null    | null   
> 2020-05   | 2020-05-29 |     5 | Y       | null   
> 2020-05   | 2020-05-30 |    10 | null    | Y      
> 2020-06   | 2020-06-03 |    10 | Y       | null   
> 2020-06   | 2020-06-05 |     5 | null    | null   
> 2020-07   | 2020-07-21 |    20 | Y       | Y      
> 2020-07   | 2020-07-22 |    10 | null    | null   
> 2020-07   | 2020-07-28 |    10 | null    | null 
1
forpas 21 सितंबर 2020, 09:50

निम्नलिखित स्निपेट ExamMonth पर आधार क्वेरी द्वारा समूहित करता है और फिर रिवार्ड 1 और रिवार्ड 2 के मूल्यों के लिए निर्णय लेते समय एक केस का उपयोग करता है। यह प्रश्न आपको केवल संकेत देने के लिए है। कृपया आपको जो सबसे अच्छा लगे उसे फिर से लिखें।


select DERIVED2.ExamMonth, CASE WHEN DERIVED2.Cumul_Score >= 10 THEN 'Y'

ELSE ''
END AS Rewards1,
CASE WHEN DERIVED2.Cumul_Score >= 20 THEN 'Y'

ELSE ''
END AS Rewards2
FROM 
(
select DERIVED1.ExamMonth, SUM(DERIVED1.score) as Cumul_Score 
FROM
(
select date_format(dateOfExam, '%Y-%m') ExamMonth,
       dateOfExam, score
from student
order by dateOfExam
) DERIVED1

GROUP BY ExamMonth

) DERIVED2
1
Ed Bighands 21 सितंबर 2020, 08:06