我有以下查询
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}},但书中说这是不可能的。
如果有人可以逐步了解幕后实际发生的事情/指出一个资源,该资源解释了如何在更多细节中发挥作用,我会欣赏它。
感谢您的帮助。
答案 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
。