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 / order by section 及其实际工作方式感到有些困惑。

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

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

最初我以为我可以DateName(mm, orderdate)按部分从组中删除,但书上说这是不可能的。

如果有人可以逐步了解幕后实际发生的事情/指出一个资源,该资源可以更详细地解释这是如何工作的,我将不胜感激。

谢谢你的帮助。

4

1 回答 1

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

请注意,我向 (MIN) 添加了一个聚合函数,col3因此我能够col3从我的 GROUP BY 子句中删除。

于 2012-06-07T17:03:28.210 回答