2012-06-07 14 views
5

Mam następujące zapytanieSQL Server przez grupę/zamówienia przez

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); 

która zwraca 3 kolumny ale datename(mm, orderdate) zwraca ciąg znaków, a zatem zamawianie przez nią stawia sierpnia przed styczniem itp

Rozwiązaniem tego problemu było następujące:

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); 

Wciąż jestem trochę zdezorientowany z całą grupą według/kolejności według sekcji i jak to działa.

O ile zrozumiałem, grupa za pomocą tworzy tabelę roboczą z 4 kolumnami (może być nie tak) datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate) i kolumną count.

Za każdym razem, gdy napotka na orderdate, że ma w tabeli pracy zwiększa liczbę, w przeciwnym razie dodaje nowy wiersz?

Początkowo myślałem, że mogę usunąć DateName(mm, orderdate) z grupy według sekcji, ale książka powiedziała, że ​​nie jest to możliwe.

Jeśli ktoś może przejść przez to, co dzieje się za kulisami/wskazać zasób, który wyjaśnia, jak działa to w nieco bardziej szczegółowy sposób, doceń to.

dzięki za pomoc.

+0

Jakie jest dokładnie Twoje pytanie? Po prostu szukasz wyjaśnienia, jak działa twoje zapytanie? –

+0

Jestem po prostu mylić, jak to działa i początkowo myślałem, że mogę usunąć DateName z sekcji Group By. –

+0

'order by orderdate' nie działa? Lub używając 'datepart' zamiast' datename 'w klauzuli' order'? – HABO

Odpowiedz

7

Za każdym razem, gdy używasz funkcji agregującej (COUNT, SUMA, MAX, itd.), Musisz uwzględnić wszystkie pozostałe kolumny w klauzuli GROUP BY. COUNT w twoim przykładzie zwraca liczbę rekordów, które mają tę samą wartość dla datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate).

Przykład:

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

Say ten powrócił:

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

Jeśli zmieniłeś adres strony to:

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

Byłoby powrotu:

1,2,3,9 

Zauważ, że dodałem funkcję Aggregate do col3 (MIN), więc udało mi się usunąć col3 z mojej klauzuli GROUP BY.

+0

, więc tabela robocza zawiera 4 kolumny, prawda? –

+0

To naprawdę nie ma znaczenia, ile kolumn ma tabela, ważne, ile wybierasz i ile z tych wybranych kolumn ma zastosowaną funkcję agregującą. –

+0

Jedno ostatnie pytanie, jeśli usunąłem liczbę (*) z instrukcji select, po prostu otrzymam 2 kolumny zwrócone, a one zostaną zamówione tak, jak przedtem, prawda? (Zakładam, że zamiast tego powinienem użyć Distinct()). –