SQL Server组由/ order by

时间:2012-06-07 16:52:20

标签: sql-server tsql

我有以下查询

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)返回一个字符串,因此按照它排序将八月份放在一月之前等。

解决方法如下:

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列(可能是错误的)datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate)count列的工作表。

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

最初我以为我可以逐个删除DateName(mm, orderdate)内的{{1}},但书中说这是不可能的。

如果有人可以逐步了解幕后实际发生的事情/指出一个资源,该资源解释了如何在更多细节中发挥作用,我会欣赏它。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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

说回来了:

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

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