Confusione di GROUP BY / aggregate function in SQL

Ho bisogno di un po ‘di aiuto per chiarire qualcosa, so che è una domanda molto facile ma è qualcosa che mi confonde leggermente in SQL.

Questa query SQL genera un errore “non un’espressione GROUP BY” in Oracle. Capisco perché, poiché so che una volta che raggruppo per un attributo di una tupla, non posso più accedere ad alcun altro attributo.

SELECT * FROM order_details GROUP BY order_no 

Tuttavia questo funziona

 SELECT SUM(order_price) FROM order_details GROUP BY order_no 

Giusto per capire concretamente … Supponendo che ci siano più tuple in order_details per ogni ordine che viene eseguito, una volta che ho raggruppato le tuple in base a order_no, posso ancora accedere all’attributo order_price per ogni singola tupla nel gruppo, ma solo usando una funzione aggregata?

In altre parole, le funzioni di aggregazione utilizzate nella clausola SELECT sono in grado di eseguire il drill down nel gruppo per visualizzare gli attributi “nascosti”, dove semplicemente utilizzando “SELECT order_no” viene generato un errore?

Grazie per il tuo aiuto nel chiarire questo, ho avuto difficoltà a trovare una risposta a questa domanda specifica su Google.

Chris

In SQL standard (ma non in MySQL), quando si utilizza GROUP BY, è necessario elencare tutte le colonne dei risultati che non sono aggregati nella clausola GROUP BY. Quindi, se order_details ha 6 colonne, allora devi elencare tutte le 6 colonne (per nome – non puoi usare * nelle clausole GROUP BY o ORDER BY) nella clausola GROUP BY.

Puoi anche fare:

 SELECT order_no, SUM(order_price) FROM order_details GROUP BY order_no; 

Ciò funzionerà perché tutte le colonne non aggregate sono elencate nella clausola GROUP BY.

Potresti fare qualcosa come:

 SELECT order_no, order_price, MAX(order_item) FROM order_details GROUP BY order_no, order_price; 

Questa query non è veramente significativa (o probabilmente non è significativa), ma funzionerà. Elencherà ogni numero di ordine separato e combinazione di prezzo dell’ordine e fornirà la massima quantità di ordine (numero) associata a quel prezzo. Se tutti gli articoli in un ordine hanno prezzi distinti, finirai con gruppi di una riga ciascuno. OTOH, se ci sono più articoli nell’ordine allo stesso prezzo (diciamo £ 0,99 ciascuno), quindi raggrupperà quelli insieme e restituirà il numero massimo di articoli dell’ordine a quel prezzo. ( (order_no, order_item) la tabella abbia una chiave primaria su (order_no, order_item) dove il primo elemento nell’ordine ha order_item = 1 , il secondo item è 2, ecc.)

Per usare la clausola group by devi menzionare tutte le colonne da select statement in to group by ma non dalla funzione di aggregazione.

Per fare questo invece di raggruppare per poter usare partizione per clausola puoi usare solo una porta per raggruppare come una partizione per.

puoi anche renderlo come partizione di 1

 SELECT * FROM order_details GROUP BY order_no 

Nella query precedente si selezionano tutte le colonne a causa di ciò il suo lancio di un errore non raggruppa per qualcosa di simile .. per evitare di dover menzionare tutte le colonne in qualsiasi istruzione select tutte le colonne devono essere in group by ..

  SELECT * FROM order_details GROUP BY order_no,order_details,etc 

ecc significa tutte le colonne dalla tabella order_details.