2013-12-08 40 views
0

我有一个表的一些事务字段,主ID是一个CUSTomer字段和一个TXN_DATE和两个,NOM_AMOUNT和GRS_AMOUNT我需要一个EndOfMonth SUM(不滚动,只是EOM,可以如果这个月没有交易,则为0)。我该怎么做?我还需要0个月没有交易报告。 谢谢!T-SQL月的总和

+0

你已经尝试过通过总和组和选择?你是否在网上查阅月份和年份功能? – rene

+0

我做过了,计算这个时有困难,现在我正在研究制作所有月份第一天的清单,然后减去一个,并找到上个月的最后一天,但无法使其工作的技巧。 – Nick

+0

如果你可以将这种努力添加到你的问题,将阻止你的问题早日结束 – rene

回答

2

如果你group by表达式month(txn_date)你可以计算出sum。如果您在月份使用带有连接的临时表,则可以确定哪些月份没有记录,因此报告0(如果不使用coalesce函数,则报告为null)。

这将是您的最终结果,我假设您可以添加您需要总结和适应您的模式的其他列。

select mnt as month 
, sum(coalesce(NOM_AMOUNT ,0)) as NOM_AMOUNT_EOM 
, sum(coalesce(GRS_AMOUNT ,0)) as GRS_AMOUNT_EOM 
from (
    select 1 as mnt 
    union all select 2 
    union all select 3 
    union all select 4 
    union all select 5 
    union all select 6 
    union all select 7 
    union all select 8 
    union all select 9 
    union all select 10 
    union all select 11 
    union all select 12) as m 
left outer join Table1 as t 
    on m.mnt = month(txn_date) 
group by mnt 

这里是最初的工作sqlfiddle

+1

有点迂腐,我知道,但“union all”的成本要低得多,但会大大简化执行计划(使OP的分析和优化更容易)。我是唯一一个认为'union'应该默认为'all'并强制用户指定'distinct'的用户是否希望排序/重复数据删除? – dav1dsm1th

+1

@ dav1dsm1th一点也不迂腐。执行计划现在确实好多了。 TNX。 – rene

+0

这的确令人印象深刻,几乎是我所追求的。请问,如何在输出中包含[id]和两个数量?我的意思是,我设计了桌子,我的主键是3个字段,如[id1] [id2]和[txn_date],我有2个字段,如amt1和amt2。我可以调整上面的逻辑来适应这个吗? – Nick