【发布时间】:2014-03-21 12:19:13
【问题描述】:
我目前正在编写一份报告以突出显示付款中断,这是基于客户在 6 月付款但在 7 月未能付款的情况。
我目前已将其设置为执行除查询,以检查一个月并将其与下一个月进行比较。类似于下面(语法可能不正确,因为我必须编辑某些数据)。
DECLARE @StartDatePaid AS DATETIME
DECLARE @EndDatePaid AS DATETIME
DECLARE @StartDateMissed AS DATETIME
DECLARE @EndDateMissed AS DATETIME
SET @StartDatePaid = '01-Oct-2013'
SET @EndDatePaid = '31-Oct-2013'
SET @StartDateMissed = '01-Nov-2013'
SET @EndDateMissed = '05-Dec-2013'
SELECT d.StoreNo
, d.CustNo
FROM (
--Paid Range
SELECT c.CustNo, m.StoreNo
FROM dbo.tblCont AS c INNER JOIN
dbo.tblContDep AS cd ON c.ContractNo = cd.ContractNo INNER JOIN
dbo.tblCust AS m ON c.CustNo = m.CustNo INNER JOIN
dbo.tblTrans AS mx ON m.CustNo = mx.CustNo AND cd.AgendaCode = mx.AgendaCode INNER JOIN
dbo.tblCalender AS cl ON mx.DateEvent = cl.Date
WHERE (cd.Payment > 0) AND (m.Closed <> 'Y') AND (cd.AgendaCode <> 'OPCLIPMT')
AND mx.DateEvent BETWEEN @StartDatePaid AND @EndDatePaid
GROUP BY c.CustNo, m.StoreNo, mx.DateEvent
EXCEPT
--Missed Range
SELECT c.CustNo, m.StoreNo
FROM dbo.tblCont AS c INNER JOIN
dbo.tblContDep AS cd ON c.ContractNo = cd.ContractNo INNER JOIN
dbo.tblCust AS m ON c.CustNo = m.CustNo INNER JOIN
dbo.tblTrans AS mx ON m.CustNo = mx.CustNo AND cd.AgendaCode = mx.AgendaCode INNER JOIN
dtLookups.dbo.tblCalender AS cl ON mx.DateEvent = cl.Date
WHERE (cd.Payment > 0) AND (m.Closed <> 'Y') AND (cd.AgendaCode <> 'OPCLIPMT') AND (mx.DateEvent BETWEEN @StartDateMissed AND @EndDateMissed )
GROUP BY c.CustNo, m.StoreNo, mx.DateEvent
) AS d
WHERE d.StoreNo IN (72, 114, 121, 139, 185, 241, 266)
GROUP BY
d.StoreNo, d.CustNo
我将把它切换为基于日历月而不是日期范围,我的问题是我如何最好地一次生成几个月的破损。一次获得一个月的月份比较,因为我只能根据提供的数据来创建一个月的破损。
所需输出示例
Month| breakges
June | 201
July | 189
Aug | 250
欢迎就最佳实践或改进方法提出建议。
【问题讨论】:
标签: sql-server-2008 cursor except