5

次のクエリがあります

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

これは 3 列を返しますがdatename(mm, orderdate)、文字列を返すため、それによる順序付けは 8 月を 1 月より前に置きます。

これに対する解決策は次のとおりでした。

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

グループごと/セクションごとの順序と、それが実際にどのように機能するかについて、まだ少し混乱しています。

私が理解している限り、group by は、4 つの列 (間違っている可能性があります) と 1 つdatepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate)の列を持つ作業テーブルを作成していcountます。

作業テーブルにあるに遭遇するたびにorderdate、カウントを増やします。それ以外の場合は、新しい行を追加しますか?

もともと、セクションごとにグループ内から を削除できると思ってDateName(mm, orderdate)いましたが、本ではそれは不可能であると書かれていました。

誰かが舞台裏で実際に起こっていることを一歩踏み出すことができたり、これがどのように機能するかをもう少し詳しく説明するリソースを指摘したりできれば、それを感謝します.

ご協力いただきありがとうございます。

4

1 に答える 1

7

集計関数 (COUNT、SUM、MAX など) を使用するときはいつでも、GROUP BY 句に他のすべての列を含める必要があります。datepart(yy, orderdate)あなたの例の COUNT は、 、datename(mm, orderdate)、に対して同じ値を持つレコードの数を返していますdatepart(mm, orderdate)

例:

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

これが返されたとします:

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

クエリを次のように変更した場合:

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

次のように返されます。

1,2,3,9

(MIN)に集計関数を追加したので、GROUP BY 句からcol3削除できたことに注意してください。col3

于 2012-06-07T17:03:28.210 に答える