今天早上我可以使用一些 SQL 帮助我是 SQL 新手,可以使用一些帮助。
我在 SSMS 中设置了一个存储过程,其目的是确定本季度迄今为止的服务交易总数。
它查看上一季度最后一笔交易的交易。例如 2020 年 6 月 30 日。发现这一点后,它开始计算本季度的交易总额。我们将交易称为“匹配”。
到目前为止,一切都很好。但是我发现了一个错误。我们经常有新账户或休眠账户,这些账户在上一季度根本没有交易,只是在本季度才开始交易。
因此,当存储过程查找上一季度的最后一笔交易但没有找到时,我会得到异常结果。
我猜我需要做的是设置查询,以便如果它没有找到上一季度的交易,它默认为零,因此其余的商店 proc 可以运行。
但我不确定如何做到这一点,或者这是否是最好的方法。
以下是我的代码,因此您可以看到我从哪里开始。请看一下,我将非常感谢有关如何进行的任何建议。
/****** Object: StoredProcedure [dbo].[sp_add_QTD_ICSMatch] Script Date: 7/13/2020 9:20:03 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_add_QTD_ICSMatch]
AS
BEGIN
--Alter Table [src].[ICSMatch]
--Add ICSQTDOutstanding decimal (18,2) null
--Alter Table [STG_ICSMatch]
--Add ICSQTDOutstanding decimal (18,2) null
DECLARE @lastQuaterEnd date,
@maxmatchdate date,
@lastQuarterOutstanding decimal(18,2),
@MaxMatchOutstanding decimal(18,2)
IF OBJECT_ID('tempdb.dbo.#QTD', 'U') IS NOT NULL
DROP TABLE #QTD;
CREATE TABLE #QTD (Tranid varchar(18),
Qtd decimal(18,2),
BankID int,
Matchdate date,
LastQuaterDate date
)
SET @maxmatchdate = (SELECT max(Match_date) FROM [src].[ICSMatch])
SET @lastQuaterEnd = (SELECT DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, @maxmatchdate), 0)) )-- Last day of last quarter
--Print @lastQuaterEnd
SET @lastQuaterEnd = (SELECT dbo.svf_getValidMatchDate(@lastQuaterEnd , 'ICS') )
--Print @lastQuaterEnd
;WITH lastQuarter as
(SELECT ICSMatch.ICSOutstanding , ICSMatch.BANK_ID ,ICSMatch.Match_date
FROM [src].[ICSMatch]
WHERE ICSMatch.Match_date = @lastQuaterEnd
),
ThisMatch AS
(
SELECT ICSMatch.ICSOutstanding , ICSMatch.BANK_ID , ICSMatch.ICSTRAN_ID , ICSMatch.Match_date
FROM [src].[ICSMatch]
WHERE ICSMatch.Match_date = @maxmatchdate
)
INSERT INTO #QTD
SELECT t.ICSTRAN_ID , (t.ICSOutstanding - l.ICSOutstanding) AS qtd , t.BANK_ID , t.Match_date , l.Match_date FROM
ThisMatch t
left join lastQuarter l on l.BANK_ID = t.BANK_ID
--where l.ICSOutstanding is not null
UPDATE ics
SET ics.ICSQTDOutstanding = q.Qtd
FROM src.ICSMatch ics
left join #QTD q ON ics.ICSTRAN_ID = q.Tranid
WHERE ics.Match_date = @maxmatchdate
END
非常感谢您的帮助。史蒂夫
如果我对您的理解正确,这应该会带您一部分,您可能也需要调整 match_date