2014-10-27 52 views
0

我有问题将以下查询分组为每月总计。 表格与表格交叉连接以提取速度,并且内部与另一个包含仅包含日期的表格进行交叉连接,以显示表格中不存在数据的日期的空值(客户端请求) 对于下面的日常分组,它可以正常工作。请如何每月进行分组。每月加入分组

Select * from(select [Letter_Date] [Date],Council 
SUM([Total_Corr])*[Rate][Total] 
FROM Correspondence 
cross join 
Input_Variable_Price 
where [Revenue_Name] = 'Correspondence' 
group by [Letter_Date],Council)AS ED 

RIGHT JOIN 
(Select '21'[No],b_date,[Revenue_Name][Report],[Unit],[Rate] 
From Blank_dates 
cross join 
Input_Variable_Price 
where [Revenue_Name] = 'Correspondence') AS BD 
ON ED.Date = BD.[b_date] 

干杯

+0

'GROUP BY'从您的日期/时间戳中提取月份? – 2014-10-27 15:25:52

+0

它不起作用。这就是我得到的结果:列'ED.Date'在选择列表中是无效的,因为它不包含在聚合函数或GROUP BY子句中。不知道还有什么要做。 – Nugeswale 2014-10-27 16:12:43

回答

1

我会使用以下方法:添加你需要的SELECT,不管在您需要的GROUP BY项目的任何其他聚合。

Select DATEADD(month, DATEDIFF(month, 0, [Date]), 0) AS StartOfMonth, SUM(Total) 
from 
    (
    select [Letter_Date] [Date],Council, 
     SUM([Total_Corr])*[Rate] [Total] 
    FROM 
     Correspondence 
     cross join 
     Input_Variable_Price 
    where [Revenue_Name] = 'Correspondence' 
    group by [Letter_Date],Council 
)AS ED 

RIGHT JOIN 
    (
    Select 
     '21'[No], 
     b_date, 
     [Revenue_Name][Report], 
     [Unit], 
     [Rate] 
    From 
     Blank_dates 
     cross join 
     Input_Variable_Price 
    where [Revenue_Name] = 'Correspondence' 
) AS BD ON 
    ED.Date = BD.[b_date] 
GROUP BY DATEADD(month, DATEDIFF(month, 0, [Date]), 0) 
+0

如果您需要以不同的方式格式化月份的名称,则可以使用[此问题的答案](http://stackoverflow.com/questions/185520/convert-month-number-to-month-name-function-in- sql)获取月份的名称,然后连接年份(将年份转换为varchar后)。 – AHiggins 2014-10-27 15:28:24

+0

即使在将月份更改为月份([日期])后,它也只能给出当前月份的结果。还有我需要它来显示查询中的费率,报告等..干杯 – Nugeswale 2014-10-27 16:18:04

+0

好吧,你为什么将它更改为'MONTH([Date])'并且之前它工作?如果您在查询中需要额外的字段,请将它们添加到SELECT和GROUP BY子句中......我不知道您的聚合和分组意图是什么,因此您必须自己完成这一部分。 – AHiggins 2014-10-27 16:29:15