2012-06-07 16 views
5

ho la seguente querySQL Server/ordine da

select 
    datepart(yy, orderDate) as 'year', 
    datename(mm, OrderDate) as 'month', 
    count(*) as 'Orders' 
from orders  (yeah I know its missing the schema, its from a book) 
group by 
    datepart(yy, orderdate), 
    datename(mm, orderdate) 
order by 
    datepart(yy, orderdate), 
    datename(mm, orderdate); 

che restituisce 3 colonne, ma datename(mm, orderdate) restituisce una stringa e quindi ordinare da essa mette agosto prima del gennaio ecc

La soluzione a questo era il seguente:

select 
    datepart(yy, orderDate) as 'year', 
    datename(mm, OrderDate) as 'month', 
    count(*) as 'Orders' 
from orders (yeah i know its missing the schema, its from a book) 
group by 
    datepart(yy, orderdate), 
    datename(mm, orderdate), 
    datepart(mm, orderdate) 
order by 
    datepart(yy, orderdate), 
    datepart(mm, orderdate); 

Sono ancora un po 'confuso con l'intero gruppo da/ordinare per sezioni e come funziona effettivamente.

Per quanto ho capito, group by sta creando una tabella di lavoro con 4 colonne (che potrebbero essere errate) datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate) e una colonna count.

Ogni volta che incontra uno orderdate che ha nella tabella di lavoro aumenta il conteggio, altrimenti aggiunge una nuova riga?

Originariamente pensavo di poter rimuovere lo DateName(mm, orderdate) all'interno del gruppo per sezione ma il libro diceva che non è possibile.

Se qualcuno può passare attraverso ciò che accade dietro le quinte/indicare una risorsa che spiega come funziona in un modo un po 'più dettagliato, lo apprezzo.

grazie per il vostro aiuto.

+0

Qual è esattamente la tua domanda? Stai solo cercando una spiegazione su come funziona la tua query? –

+0

Im semplicemente confuso su come funziona e originariamente pensavo di poter rimuovere il DateName dalla sezione Raggruppa per. –

+0

"order by orderdate' non funziona? O usando 'datepart' piuttosto che' datename' nella clausola 'order'? – HABO

risposta

7

Ogni volta che si utilizza una funzione di aggregazione (COUNT, SUM, MAX, ecc.) È necessario includere tutte le altre colonne in una clausola GROUP BY. COUNT nell'esempio restituisce il numero di record con lo stesso valore per datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate).

Un esempio:

SELECT col1, col2, col3, MAX(col4) 
FROM MyTable 
GROUP BY col1, col2, col3 

dico questo restituito:

1,2,3,9 
1,2,5,9 

Se si modifica la query per questo:

SELECT col1, col2, MIN(col3), MAX(col4) 
FROM MyTable 
GROUP BY col1, col2 

che sarebbe tornato:

1,2,3,9 

Si noti che ho aggiunto una funzione Aggregazione a col3 (MIN), quindi sono stato in grado di rimuovere col3 dalla mia clausola GROUP BY.

+0

quindi la tabella di lavoro contiene 4 colonne, giusto? –

+0

Non importa quante colonne ha la tabella, importa quante persone si stanno selezionando e quante di quelle colonne selezionate hanno una funzione aggregata applicata a loro. –

+0

Un'ultima domanda, se ho rimosso il conteggio (*) dall'istruzione select, otterrei solo 2 colonne restituite, e sarebbero state ordinate com'erano prima, giusto? (Suppongo che dovrei usare Distinct() invece). –