Sql server MsSQL:查找在历史范围内丢失的帐户
我有一个包含以下列的数据库:Sql server MsSQL:查找在历史范围内丢失的帐户,sql-server,Sql Server,我有一个包含以下列的数据库: ReportMonth, AccountID, Status 每个月都会运行一个报告,用于填写给定月份的AccountID和状态的数据。但是,众所周知,报告有时不填充帐户的状态(即使应该填充) 我想设计一个查询来查找这些“丢失”的帐户,并报告它们丢失的所有月份。例如,假设我报告了2014年1月(以及前几个月)的账户123。现在是2014年6月,我没有2月、3月等账户123的任何记录。我想要一份列表,列出该账户缺失的月份,如: ReportMonth, Accoun
ReportMonth, AccountID, Status
每个月都会运行一个报告,用于填写给定月份的AccountID和状态的数据。但是,众所周知,报告有时不填充帐户的状态(即使应该填充)
我想设计一个查询来查找这些“丢失”的帐户,并报告它们丢失的所有月份。例如,假设我报告了2014年1月(以及前几个月)的账户123。现在是2014年6月,我没有2月、3月等账户123的任何记录。我想要一份列表,列出该账户缺失的月份,如:
ReportMonth, AccountID, MissingSince, LastStatus
到目前为止,通过使用左连接并搜索空值,我已经能够找到与上个月相比下降的帐户,如下所示:
left outer join #StatusCodes b on a.AccountID= b.AccountID
and datediff(m,0,a.ReportMonth) = datediff(m,0,b.ReportMonth)-1
...
and b.AccountID is null
但这显然只在一个月内有效
应为2月至4月之间的报告月输出1,为5月以后的报告月输出2。即:
ReportMonth | Dropped Accounts
Jan 2014. | 0
Feb 2014. | 1
March 2014. | 1
Apr 2014. | 1
May 2014. | 2
Jun 2014. | 2
这应该让你开始 隔离月/科目的所有
不同的值,然后交叉应用它们,然后与reportHist
表进行比较,并通过CASE
和SUM()
结果填充缺失行的1/0
小提琴
你能发布一些示例输入和所需输出吗?否则我会帮忙的!补充!我不清楚你想得到什么。只是缺少计数?你能发布一些输入和输出示例吗?对不起,在手机上编辑是相当困难的。示例输入在小提琴中,输出在最后一位。我认为这确实有很大帮助,我不确定如何在这里使用交叉应用。我本想花几个月的时间在那里申请,但现在正好相反。我会试试看,看能否让你的方法发挥作用。:)我修改了代码以忽略尚未出现的帐户,并忽略预期帐户将消失的情况。不幸的是,SQLFiddle并没有真正显示它工作得那么好(我责备小数据集),但它工作得很好!
IF OBJECT_ID('TEMPDB..#reportHist') IS NOT NULL
DROP TABLE #reportHist
CREATE TABLE #reportHist
(
ReportMonth datetime,
AccountID varchar(20),
Status varchar(30)
);
INSERT INTO #reportHist
(ReportMonth, AccountID, Status)
VALUES
('1-1-2014','123','Good'),
('1-1-2014','999','Good'),
('2-1-2014','999','Bad'),
('3-1-2014','999','Good'),
('4-1-2014','999','Good');
;WITH DistinctAccount
AS
(
SELECT DISTINCT AccountID
FROM #reportHist
)
, DistinctMonth
AS
(
SELECT DISTINCT ReportMonth
FROM #reportHist
)
SELECT DM.ReportMonth, SUM(CASE WHEN RH.AccountID IS NULL THEN 1 ELSE 0 END) AS [Dropped Accounts]
FROM DistinctAccount DA
CROSS APPLY DistinctMonth DM
LEFT OUTER JOIN #reportHist RH
ON DA.AccountID = RH.AccountID
AND DM.ReportMonth = RH.ReportMonth
GROUP BY DM.ReportMonth