Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MsSQL:查找在历史范围内丢失的帐户_Sql Server - Fatal编程技术网

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