sql >> Databáze >  >> RDS >> Mysql

Dotaz s GROUP BY a ORDER BY nefunguje, když je vybráno více sloupců v SELECT

Při používání GROUP BY musíte být opatrní . Jakmile pochopíte, co GROUP BY ano, problém poznáte sami. Provádí agregaci vašich dat nebo jinými slovy redukuje vaše data tím, že provádí určitou operaci s nezpracovanými položkami a vytváří nový redukovaný počet položek, na které byla použita nějaká agregační funkce (SUM, COUNT, AVG atd.)

Pole, která zadáte v GROUP BY klauzule představuje úroveň agregace/souhrnu, o kterou usilujete.

SELECT col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1

Zde se pokoušíte provést agregaci na col1 level, což znamená, že pro každou odlišnou hodnotu ve sloupci col1 , bude provedena určitá operace na některých dalších sloupcích, které zadáte v SELECT klauzule (zde col2 ,col3 ), takže ve výstupu máte neopakující se hodnoty v col1 a některé shrnuté hodnoty col2 a col3 proti každému odlišnému col1 hodnotu podle toho, jakou funkci použijete (SUM, COUNT, AVG atd.).

Jak tuto funkci aplikujete? To je to, co ve vašem výše uvedeném dotazu chybí. Chcete-li to vyřešit, musíte použít nějakou agregační funkci na pole, která jsou přítomna v SELECT klauzule, ale ne v GROUP BY doložka. Vezmeme-li příklad SUM, zkuste toto:

SELECT SUM(col2), SUM(col3) FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1

NEBO pro lepší představu odstraňte WHERE filtr a kontrolu výstupu spuštěním:

SELECT col1, SUM(col2), SUM(col3) FROM tbl GROUP BY col1 ORDER BY col1

Navíc důvod, proč váš druhý dotaz

SELECT col2 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2

fungovalo proto, že na pole nemusíte aplikovat agregaci (zde col2 ), který je přítomen v GROUP BY klauzule.



  1. Při čtení dat od poskytovatele došlo k chybě. Vzdálený certifikát je podle ověřovací procedury neplatný

  2. chyba mySQL:#1248 - Každá odvozená tabulka musí mít svůj vlastní alias

  3. Jak vložit blob do databáze pomocí SQL Server Management Studio

  4. C# Chyba MySQL Počet sloupců neodpovídá počtu hodnot na řádku 1