/ / sql - Dlaczego MAX () z SUM () nie działa? - mysql, sql, sum, max

sql - Dlaczego funkcja MAX () funkcji SUMA () nie działa? - mysql, sql, suma, max

Próbuję zrozumieć, dlaczego polecenie SQL z MAX(SUM(col)) daje błąd składniowy. Mam dwie tabele jak poniżej:

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

Tabela personelu

+--------+-------+----------+
| 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     |
+--------+-------+----------+

Tabela wyników

Zasadniczo mam tabelę szczegółów i tabelę wyników. Chcę znaleźć nazwisko i oceny kandydata, który uzyskał najwyższy wynik SUB1 i SUB2 łączny. Zasadniczo osoba o najwyższych zagregowanych znakach.

Mogę znaleźć sumę SUB1 i SUB2 dla wszystkich kandydatów korzystających z następującego zapytania:

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

Daje następujące dane wyjściowe:

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

To jest w porządku, ale potrzebuję, aby dane wyjściowe były tylko D | 198 ponieważ jest najlepszym strzelcem. Teraz, gdy modyfikuję zapytanie w następujący sposób, kończy się niepowodzeniem:

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

W MySQL pojawia się błąd Invaild Group Function.

Teraz szukając SO otrzymałem poprawną odpowiedź, która używa tabel pochodnych. Otrzymuję odpowiedź za pomocą następującego zapytania:

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;

Ale moje pytanie jest Dlaczego nie "t" MAX(SUM(col)) pracować?

Nie rozumiem, dlaczego max nie może obliczyćwartość zwrócona przez SUM (). Teraz odpowiedź na SO stwierdza, że ​​skoro SUM () zwraca tylko jedną wartość, to MAX () nie ma sensu obliczać wartości jednej wartości, ale przetestowałem następujące zapytanie -:

select max(foo) from a;

w tabeli „a”, która ma tylko jeden wiersz z jedną kolumną foo który zawiera wartość całkowitą. Jeśli więc MAX () nie może obliczyć pojedynczych wartości, to jak to działa?

Czy ktoś może mi wyjaśnić, jak procesor zapytańwykonuje zapytanie i dlaczego otrzymuję błąd nieprawidłowej funkcji grupy? Z punktu widzenia czytelności przy użyciu MAX (SUM (col)) jest idealny, ale nie działa w ten sposób. Chcę wiedzieć, dlaczego.

MAX i SUM nigdy nie używać razem? Pytam, ponieważ widziałem takie pytania MAX(COUNT(col)). Nie rozumiem, jak to działa, a nie to.

Odpowiedzi:

1 dla odpowiedzi № 1

Błąd jest 1111: invalid use of group function. Jeśli chodzi o to, dlaczego konkretnie MySQL ma ten problem, mogę tylko powiedzieć, że jest on częścią samego silnika. SELECT MAX(2) działa (pomimo braku GROUP BY) ale SELECT MAX(SUM(2)) nie działa.

Ten błąd wystąpi podczas grupowania / agregowania funkcji, takich jak MAX są używane w niewłaściwym miejscu, np. w a WHERE klauzula. SELECT SUM(MAX(2)) również nie działa.

Możesz sobie wyobrazić, że MySQL próbuje agregować jednocześnie, zamiast wykonywać czynności w kolejności operacji, tj. Nie SUM najpierw, a potem pobierz MAX. Dlatego musisz wykonywać zapytania jako osobne kroki.


4 dla odpowiedzi nr 2

Funkcje agregujące wymagają argumentu, który zapewnia wartość dla każdego wiersza w grupie. Inne funkcje agregujące tego nie robią.

W każdym razie nie jest to zbyt sensacyjne. Załóżmy, że MySQL został zaakceptowany MAX(SUM(col)) - co to znaczy? Więc to SUM(col) daje sumę wszystkich nieNULL wartości kolumny col nad wszystkimi wierszami odpowiedniej grupy, która jest pojedynczą liczbą. Możesz wziąć MAX() o tym, że to ta sama liczba, ale jaki byłby sens?

Twoje podejście używające podzapytania jest inne, przynajmniej w zasadzie, ponieważ agreguje się dwa razy. Wewnętrzna agregacja, w której wykonujesz SUM(), oblicza osobną sumę dla każdej wartości p.pname. Następnie zapytanie zewnętrzne oblicza maksimum we wszystkich wierszach zwróconych przez podzapytanie (ponieważ nie określono a GROUP BY w zewnętrznym zapytaniu). Jeśli tego chcesz, to musisz to określić.


1 dla odpowiedzi nr 3

Spróbuj czegoś takiego:

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 dla odpowiedzi nr 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);

Nie uruchomiłem tego, ale spróbuj tego. Mam nadzieję, że zadziała :)