使用datepart()和group by命令

时间:2012-12-19 16:50:35

标签: sql sql-server sql-server-2008

我正在打击我的头脑,我确定,非常明显 -

我有一些SQL代码,用于汇总商店中每张发票的总售价,然后按月组织。

select SUM(totalsellingprice) from dbo.tblServiceOrders
where datepart(MONTH,dbo.tblServiceOrders.datereceived) =12

据我了解,这应该从第12个月(12月)返回所有totatlsellingprice的总和。目前,此查询返回

135998.92

然而,如果我然后尝试将其放入一个组中以使其吐出所有月份,则数字会发生变化。

select SUM(totalsellingprice) from dbo.tblServiceOrders
group by datepart(MONTH,dbo.tblServiceOrders.datereceived)

我得到了这张桌子 -

 1 - 110567.70
 2 - 60059.59
 3 - 135998.92
 4 - 63089.22
 5 - 102287.01
 6 - 71088.68
 7 - 149102.10
 8 - 67722.65
 9 - 67122.45
10 - 64234.82
11 - 7542.05
12 - 130461.10

有12行,听起来不错(一年12个月),但最后一行是130461。

第二次搜索的第12行怎么可能与第一次搜索中的第12行不一样?我觉得我错过了一些明显的东西,但我不能为我的生活找出什么。

非常感谢任何和所有帮助!

2 个答案:

答案 0 :(得分:13)

我明白了:

您的查询非常混乱,因为它不包含MONTH列:

如果您已经这样做了,您会意识到MONTH没有对您的查询进行排序,因此,MONTH 12将作为查询的第3行返回。

select SUM(totalsellingprice) from dbo.tblServiceOrders
group by datepart(MONTH,dbo.tblServiceOrders.datereceived)
order by datepart(MONTH,dbo.tblServiceOrders.datereceived)

请不要参考行索引来选择哪个月与哪个总和相关。并且应该是区分年份(如果需要)的好主意。

答案 1 :(得分:0)

运行它,看看它做了什么......

 select dateadd(month, datediff(month, 0, datereceived),  0),
      Sum(totalsellingprice) 
 from dbo.tblServiceOrders
 group by dateadd(month, datediff(month, 0, datereceived),  0)