SQL Server组由/ order by

Han*_*del 5 t-sql sql-server

我有以下查询

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);
Run Code Online (Sandbox Code Playgroud)

返回3列但datename(mm, orderdate)返回一个字符串,因此按照它排序将八月份放在一月之前等.

解决方案如下:

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);
Run Code Online (Sandbox Code Playgroud)

我仍然对整个组有点困惑/按部分顺序以及它实际上是如何工作的.

据我所知,group by正在创建一个包含4列(可能是错误的)datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate)和一count列的工作表.

每次遇到orderdate它在工作表中的时间都会增加计数,否则会增加一个新行?

最初我以为我可以逐个删除DateName(mm, orderdate)组中的内容,但书中说这是不可能的.

如果有人可以逐步了解幕后实际发生的事情/指出一个资源,该资源解释了这是如何工作的更多细节ID欣赏它.

谢谢你的帮助.

Abe*_*ler 7

每次使用聚合函数(COUNT,SUM,MAX等)时,都需要在GROUP BY子句中包含所有其他列.COUNT在你的例子是返回的具有相同值的记录数datepart(yy, orderdate),datename(mm, orderdate),datepart(mm, orderdate).

一个例子:

SELECT col1, col2, col3, MAX(col4)
FROM MyTable
GROUP BY col1, col2, col3
Run Code Online (Sandbox Code Playgroud)

说这回来了:

1,2,3,9
1,2,5,9
Run Code Online (Sandbox Code Playgroud)

如果您将查询更改为:

SELECT col1, col2, MIN(col3), MAX(col4)
FROM MyTable
GROUP BY col1, col2
Run Code Online (Sandbox Code Playgroud)

它将返回:

1,2,3,9
Run Code Online (Sandbox Code Playgroud)

请注意,我向col3(MIN)添加了一个Aggregate函数,因此我可以col3从GROUP BY子句中删除.