Io non ce la faccio più...
Perchè se scrivo questa query:
SELECT Data, Tot, Gen, Feb, Mar, Apr, Mag, Giu, Lug, Ago, [Set], Ott,
Nov, Dic, Macchina
FROM TabellaPivot
WHERE (YEAR(Data) = 2007)
GROUP BY Macchina
Mi restituisce questo errore:
La colonna 'TabellaPivot.Data' non è valida nell'elenco di selezione
perché non è inclusa né in una funzione di aggregazione né nella
clausola GROUP BY.
Se invece faccio questa query:
SELECT year(Data) as Anno
FROM TabellaPivot
GROUP BY year(Data)
ORDER BY Anno
Invece va tutto bene...
Perchè????
Cos'è che sbaglio???
Vi prego di aiutarmi, perchè non ho ancora capito come funziona il
comando GROUP BY...
> Perchè????
> Cos'è che sbaglio???
Il comando GROUP BY nella maggior parte dei casi si usa per applicare
funzioni di aggregazione (es. somma) ad una o più colonne, raggruppando
i dati in base ai valori che specifichi nella SELECT.
Cerco di spiegarmi:
tu hai scritto l'istruzione
---
SELECT year(Data) as Anno
FROM TabellaPivot
GROUP BY year(Data)
ORDER BY Anno
---
che funziona, ma in realtà non ti è di utilità.
Per capire il GROUP BY potresti fare un'istruzione tipo
---
SELECT year(DataOrdine) AS AnnoOrdine
,sum(importo) AS Totale
FROM TabellaOrdiniCliente
GROUP BY year(DataOrdine)
ORDER BY year(DataOrdine)
---
in questo caso chiedi a SQL Server di fare la somma dell'importo degli
ordini dei clienti, raggruppando il valore per anno.
Come vedi, l'anno è specificato nella clausola GROUP BY e anche nella
SELECT.
Se infatti tu chiedi un raggruppamento per anno, e poi nella select
specifichi altre colonne, come farebbe SQL Server a restituirti i dati
raggruppandoli per anno?
> Vi prego di aiutarmi, perchè non ho ancora capito come funziona il
> comando GROUP BY...
Ehm... questo l'abbiamo capito :-))
HTH
--
David Martin
Il motivo è scritto a chiare lettere: il campo data non fa parte di una
funzione di aggregazione.
E così tutti quelli che seguono...( Tot, Gen, Feb, Mar, Apr, Mag, Giu, Lug,
Ago, [Set], Ott,
Nov, Dic ).
In pratica, non puoi prendere tanti elementi e forzarli in un unico record,
devi scegliere come aggregarli, oppure estrarne i distintivi!
Per avere una group by corretta, tutti i campi devono:
- o essere compresi nella clausola group by
- o fare parte di funzioni come SUM, MAX, AVG, MIN, etc...
Ciao!
Fabio
"Alessandro Vaia" <alessan...@gmail.com> ha scritto nel messaggio
news:1171617390....@j27g2000cwj.googlegroups.com...
Ciao Alessandro,
Semplifichiamo il discorso.
Supponiamo di avere la seguente tabella:
USE tempdb;
CREATE TABLE dbo.myTable(
Col1 int NOT NULL,
Col2 int NOT NULL
);
INSERT dbo.myTable VALUES(1, 1);
INSERT dbo.myTable VALUES(1, 2);
e di voler scrivere questa query:
SELECT Col1, Col2
FROM dbo.myTable
GROUP BY Col1;
Usa la testa, tu stai dicendo di raggruppare per Col1 le due righe,
ottenendone 1 sola. Perfetto.
Che risultato ti aspetteresti per Col2? 1, 2, o qualcos'altro?
Questa query non è risolvibile, infatti se la esegui otterrai il seguente
errore:
/* Output:
Msg 8120, Level 16, State 1, Line 1
Column 'dbo.myTable.Col2' is invalid in the select list because it is not
contained in either an aggregate function or the GROUP BY clause.
*/
Ovvero la colonna 'dbo.myTable.Col2' non è valida nella select list perché
non è contenuta in una funzione di aggregazione o nella clausola GROUP BY.
La prima soluzione che ti propongo consiste nell'applicare una funzione di
aggregazione alla colonna Col2 che non figura nella clausola ORDER BY. Ad
esempio potrei decidere che raggruppando le righe per Col1, voglia ottenere
il massimo valore di Col2. Bene, non mi resta che applicare la funzione di
aggregazione MAX():
SELECT Col1, MAX(Col2) AS MassimoValoreDiCol2
FROM dbo.myTable
GROUP BY Col1
/* Output:
Col1 MassimoValoreDiCol2
----------- -------------------
1 2
(1 row(s) affected)
*/
Come vedi ora la query finziona, dato che logicamente ho indicato al DBMS
che valore "scegliere" tra tutti quelli di Col2 :-)
Sui Books Online troverai l'elenco di tutte le funzioni di aggregazione
offerte dal T-SQL.
In alternativa sei costretto a raggruppare per entrambe le colonne, ma in
questo caso non avverrà alcun raggruppamento dato che "le coppie di valori"
sono univoche:
SELECT Col1, Col2
FROM dbo.myTable
GROUP BY Col1, Col2
/* Output:
Col1 Col2
----------- -----------
1 1
1 2
(2 row(s) affected)
*/
OK?
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org