我有以下查询
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欣赏它.
谢谢你的帮助.
每次使用聚合函数(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子句中删除.