/ / sql - SUM () काम क्यों नहीं करता है? - mysql, sql, sum, max

एसक्यूएल - एसयूएम () के मैक्स () काम क्यों नहीं करता है? - mysql, sql, sum, max

मैं समझने की कोशिश कर रहा हूं कि एसक्यूएल की कमान क्यों MAX(SUM(col)) एक सिंटैक्स त्रुटि देता है। मेरे पास नीचे के रूप में दो टेबल हैं:

+--------+--------+---------+-------+
| pname  | rollno | address | score |
+--------+--------+---------+-------+
| A      |      1 | CCU     |  1234 |
| B      |      2 | CCU     |  2134 |
| C      |      3 | MMA     |  4321 |
| D      |      4 | MMA     |  1122 |
| E      |      5 | CCU     |  1212 |
+--------+--------+---------+-------+

कार्मिक तालिका

+--------+-------+----------+
| rollno | marks | sub      |
+--------+-------+----------+
|      1 |    90 | SUB1     |
|      1 |    88 | SUB2     |
|      2 |    89 | SUB1     |
|      2 |    95 | SUB2     |
|      3 |    99 | SUB1     |
|      3 |    99 | SUB2     |
|      4 |    82 | SUB1     |
|      4 |    79 | SUB2     |
|      5 |    92 | SUB1     |
|      5 |    75 | SUB2     |
+--------+-------+----------+

परिणाम तालिका

अनिवार्य रूप से मेरे पास विवरण तालिका और परिणाम तालिका है। मैं उस उम्मीदवार का नाम और निशान ढूंढना चाहता हूं जिसे सबसे अधिक अंक मिले हैं SUB1 तथा SUB2 संयुक्त। मूल रूप से उच्चतम अंक वाले व्यक्ति।

का योग पा सकता हूं SUB1 तथा SUB2 निम्नलिखित क्वेरी का उपयोग करने वाले सभी उम्मीदवारों के लिए-:

select p.pname, sum(r.marks) from personel p,
result r where p.rollno=r.rollno group by p.pname;

यह निम्नलिखित आउटपुट देता है:

+--------+--------------+
| pname  | sum(r.marks) |
+--------+--------------+
| A      |          178 |
| B      |          167 |
| C      |          184 |
| D      |          198 |
| E      |          161 |
+--------+--------------+

यह ठीक है, लेकिन मुझे केवल आउटपुट की आवश्यकता है D | 198 के रूप में वह उच्चतम स्कोरर है। अब जब मैं निम्नलिखित की तरह क्वेरी को संशोधित करता हूं तो यह विफल हो जाता है-:

select p.pname, max(sum(r.marks)) from personel p,
result r where p.rollno=r.rollno group by p.pname;

MySQL में मुझे त्रुटि मिलती है Invaild Group Function.

अब SO पर खोज करने पर मुझे अपना सही उत्तर मिला जो व्युत्पन्न टेबल का उपयोग करता है। मैं निम्नलिखित प्रश्न का उपयोग करके अपना उत्तर प्राप्त करता हूं-:

SELECT
pname, MAX(max_sum)
FROM
(SELECT
p.pname AS pname, SUM(r.marks) AS max_sum
FROM
personel p, result r
WHERE
p.rollno = r.rollno
GROUP BY p.pname) a;

लेकिन मेरा सवाल है क्यों नहीं "टी MAX(SUM(col)) काम ?

मुझे समझ में नहीं आता कि "अधिकतम गणना क्यों नहीं की जा सकती"SUM द्वारा वापस किया गया मान ()। अब SO पर एक उत्तर में कहा गया है कि चूंकि SUM () केवल एक ही मान देता है इसलिए MAX () एक मूल्य के मूल्य की गणना करने के लिए अपना अर्थहीन लगता है, लेकिन मैंने निम्नलिखित प्रश्न का परीक्षण किया है:

select max(foo) from a;

टेबल "ए" पर केवल एक कॉलम के साथ केवल एक पंक्ति होती है जिसे कॉल किया जाता है foo जो पूर्णांक मान रखता है। तो अगर MAX () एकल मानों की गणना नहीं कर सकता है तो यह कैसे काम करता है?

क्या कोई मुझे समझा सकता है कि क्वेरी प्रोसेसर कैसे हैक्वेरी निष्पादित करता है और मुझे अमान्य समूह फ़ंक्शन की त्रुटि क्यों मिलती है? MAX (SUM (col)) का उपयोग करने की पठनीयता के दृष्टिकोण से सही है, लेकिन यह इस तरह से काम नहीं करता है। मैं जानना चाहता हूं कि क्यों।

कर रहे हैं MAX तथा SUM कभी एक साथ उपयोग नहीं किया जा सकता है? मैं पूछ रहा हूं क्योंकि मैंने जैसे प्रश्न देखे हैं MAX(COUNT(col))। मैं नहीं समझता कि यह कैसे काम करता है और यह नहीं।

उत्तर:

उत्तर № 1 के लिए 1

त्रुटि है 1111: invalid use of group function। क्योंकि MySQL के पास विशेष रूप से यह समस्या है कि मैं वास्तव में केवल यह कह सकता हूं कि यह अंतर्निहित इंजन का हिस्सा है। SELECT MAX(2) काम करता है (कमी के बावजूद GROUP BY) परंतु SELECT MAX(SUM(2)) काम नहीं करता।

यह त्रुटि तब होगी जब समूहन / एकत्रीकरण जैसे कार्य MAX गलत जगह पर उपयोग किया जाता है जैसे कि ए WHERE खंड। SELECT SUM(MAX(2)) भी काम नहीं करता है।

आप कल्पना कर सकते हैं कि MySQL परिचालन के क्रम में चीजों को करने के बजाय दोनों को एक साथ संयोजित करने का प्रयास करता है, अर्थात यह नहीं करता है SUM पहले और फिर प्राप्त करें MAX। यही कारण है कि आपको प्रश्नों को अलग-अलग चरणों के रूप में करने की आवश्यकता है।


जवाब के लिए 4 № 2

समूह के प्रत्येक कार्य के लिए समूह में प्रत्येक पंक्ति के लिए एक मान प्रदान करने वाले तर्क की आवश्यकता होती है। अन्य समग्र कार्य "ऐसा नहीं करते हैं"।

यह वैसे भी बहुत कामुक नहीं है। मान लीजिए कि MySQL स्वीकार कर लिया गया है MAX(SUM(col)) - इसका क्या मतलब होगा? अच्छी तरह से SUM(col) सभी गैर का योग देता है-NULL स्तंभ के मान col संबंधित समूह की सभी पंक्तियों पर, जो कि एक एकल संख्या है। आप ले सकते हैं MAX() उस संख्या का वही होना, लेकिन बिंदु क्या होगा?

एक उप-वर्ग का उपयोग करने का आपका दृष्टिकोण अलग-अलग है, कम से कम सिद्धांत रूप में, क्योंकि यह दो बार एकत्र होता है। आंतरिक एकत्रीकरण, जिसमें आप प्रदर्शन करते हैं SUM(), के प्रत्येक मूल्य के लिए एक अलग राशि की गणना करता है p.pname। बाहरी क्वेरी फिर सबक्वेरी द्वारा लौटी सभी पंक्तियों में अधिकतम गणना करती है (क्योंकि आप निर्दिष्ट नहीं करते हैं GROUP BY बाहरी क्वेरी में)। यदि आप जो चाहते हैं, वह आपको इसे निर्दिष्ट करने की आवश्यकता है।


उत्तर № 3 के लिए 1

इस तरह कुछ कोशिश करें:

select max(rs.marksums) maxsum from
(
select p.pname, sum(r.marks) marksums from personel p,
result r where p.rollno=r.rollno group by p.pname
) rs

जवाब के लिए 0 № 4
with temp_table (name, max_marks) as
(select name, sum(marks) from personel p,result  r, where p.rollno = r.rollno group by p.name)
select *from temp_table where max_marks = (select max(max_marks) from temp_table);

मैंने इसे नहीं चलाया। लेकिन इसे आज़माएँ। आशा है कि यह काम करेगा :)