2017-02-10 56 views
0

我有一个名为'订单'且'entry_date'[datatype:datetime2(7)]作为订单制作日期的表。与此日期相对应,我有一个名为'order_amt'[datatype:money]的列,其中存储了订单的金额。该表还具有'refund_date'[datatype:datetime2(7)]和'refund_amt'存储退款日期和金额。 我必须为2015年的每个月选择总收入[order_amt-refund_amt]。从日期列中分组月份并为所有月份添加数量

P.S:我是SQL新手,还有Stackoverflow。据我所知,

+0

标签您正在使用的数据库管理系统。添加一些示例表格数据和预期结果 - 以及格式化文本。 – jarlh

+0

假设订单于2015年12月发出,但退款发生在2016年。您是否想要在2015年的计算中计算退款金额,还是应该将其视为零? –

+0

2015年应该被视为0。感谢Tim – Gompu

回答

0

datetime2是一个SQL Server类型。如果是这样,那么你可以尝试以下查询:

DECLARE @start_date Date, @end_date DATE 
SET @start_date = '2015-01-01' 
SET @end_date = '2015-12-31' 

SELECT DATEPART(MONTH, entry_date) AS month, 
     SUM(order_amt - refund_amt) AS total_revenue 
FROM Orders 
WHERE entry_date >= @start_date AND entry_date <= @end_date 
GROUP BY DATEPART(MONTH, entry_date) 

注:DATEPART(MONTH, entry_date)提取月份从entry_date列,这是您要使用什么组。 @start_date@end_date变量指定用于entry_date的边界。

+0

感谢您的即时回复。是否会考虑退款日期。 – Gompu

+0

另外,如果我必须声明并使用开始和结束日期范围的变量,答案将会如何变化? – Gompu

+0

你想如何定义订单的年份? 2015年为了将订单计算在内,还需要进行退款吗? –

0

试试这个

select datepart(month,entry_Date) as month, 
sum(order_amt-coalesce(refund_amt,0))) as total_amount 
from orders 
where entry_date>='20150101' and entry_date<'20160101' 
group by datepart(month,entry_Date) 
+0

感谢您的回复。我是否必须考虑退款日期? – Gompu