SQL总和和分组依据(MS SQL)

SQL总和和分组依据(MS SQL),sql,sql-server-2008,group-by,Sql,Sql Server 2008,Group By,以下设置: PredDate WtSumLoc 2017-02-16 00:00:00.000 1360.139000 2017-02-16 00:00:00.000 399.444000 2017-02-28 00:00:00.000 400.000000 2017-02-28 00:00:00.000 8231.046000 2017-02-28 00:00:00.000 400.000000 2017-03-01

以下设置:

PredDate                    WtSumLoc
2017-02-16 00:00:00.000     1360.139000
2017-02-16 00:00:00.000     399.444000
2017-02-28 00:00:00.000     400.000000
2017-02-28 00:00:00.000     8231.046000
2017-02-28 00:00:00.000     400.000000
2017-03-01 00:00:00.000     1118.055000
2017-04-15 00:00:00.000     400.000000
2017-04-15 00:00:00.000     2488.699000
2017-04-28 00:00:00.000     1555.556000
2017-04-28 00:00:00.000     1555.252000
2017-06-30 00:00:00.000     432.704000
我尝试通过以下操作,按此表进行汇总和分组:

SELECT

MONTH(PredDate) 'Month',
sum(WtSumLoc) as 'sum'

FROM Table

GROUP BY PredDate
ORDER BY Month
我得到以下结果:

Month   sum
2       1759.583000
2       9031.046000
3       1118.055000
4       2888.699000
4       40.000000
4       3110.808000
6       432.704000

为什么不把它们分组?这40.000是从哪里来的?

符合ANSI SQL的解决方案是将月份提取部分封装在派生表中,并按其结果分组:

select "Month", sum(WtSumLoc) as 'sum'
from
(
    SELECT MONTH(PredDate) 'Month', WtSumLoc
    FROM Table
) dt
GROUP BY "Month"
ORDER BY Month

ANSI SQL使用双引号分隔标识符,例如
“月”
。SQL Server也支持方括号,如
[Month]
。单引号用于字符串文本。

因为您按日期分组,因此接收到不同的日期,但输出这些日期的月份-因此,对于同一个月中的两个不同日期,您接收到两条不同的记录

您必须将查询更改为

SELECT

MONTH(PredDate) 'Month',
sum(WtSumLoc) as 'sum'

FROM Table

GROUP BY    MONTH(PredDate)
ORDER BY Month
您还必须按月对其进行分组(日期前)

SELECT

MONTH(PredDate) 'Month',
sum(WtSumLoc) as 'sum'

FROM Table

GROUP BY MONTH(PredDate)
ORDER BY Month