Ce face ANY_VALUE()
Cu modul SQL ONLY_FULL_GROUP_BY (activ implicit), MySQL refuză o interogare cu GROUP BY care afișează o coloană ce nu apare în GROUP BY și nu este agregată, pentru că pe un grup pot exista mai multe valori. Primești eroarea 1055.
ANY_VALUE() spune serverului că nu contează ce valoare se alege din grup, de obicei pentru că știi că toate valorile sunt la fel (de exemplu, orașul unui client). Funcția nu este o funcție de agregare: doar oprește verificarea.
Parametri
| Parametru | Descriere |
|---|---|
coloana |
Coloana sau expresia afișată. |
Ce returnează
O valoare din grup, de același tip ca argumentul.
Exemple
Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.
CREATE TABLE vanzari (
oras VARCHAR(20),
produs VARCHAR(20),
suma INT
);
INSERT INTO vanzari VALUES
('Iași', 'Laptop', 3500),
('Iași', 'Mouse', 160),
('Cluj', 'Laptop', 7000),
('Cluj', 'Mouse', 80),
('Cluj', NULL, 300);
Exemplul 1: Eroarea fără ANY_VALUE()
SELECT oras, produs, SUM(suma) FROM vanzari GROUP BY oras;
Rezultat în MySQL
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'magazin.vanzari.produs' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Exemplul 2: Coloana suplimentară acceptată
Pentru fiecare oraș, MySQL alege un produs oarecare din grup.
SELECT oras, ANY_VALUE(produs) AS un_produs, SUM(suma) AS total
FROM vanzari
GROUP BY oras
ORDER BY oras;
Rezultat
+-------+-----------+-------+
| oras | un_produs | total |
+-------+-----------+-------+
| Cluj | Laptop | 7380 |
| Iași | Laptop | 3660 |
+-------+-----------+-------+
Exemplul 3: Agregat fără GROUP BY
SELECT ANY_VALUE(oras) AS un_oras, SUM(suma) AS total FROM vanzari;
Rezultat
+---------+-------+
| un_oras | total |
+---------+-------+
| Iași | 11040 |
+---------+-------+
Greșeli frecvente
- Folosești
ANY_VALUE()pe o coloană cu valori diferite în grup și te bazezi pe rezultat. Valoarea aleasă nu este garantată; adaug-o înGROUP BYsau foloseșteMIN()/MAX().
Comenzi înrudite
GROUP BY: Grupează rândurile cu aceeași valoare, ca să calculezi totaluri pentru fiecare grup.MIN / MAX: Returnează cea mai mică și cea mai mare valoare dintr-o coloană.GROUPING(): Deosebește rândurile de subtotal create de WITH ROLLUP (1) de rândurile obișnuite (0).