Tsql 从单个数据表中写入每个帐户的所有期间天数
我有一个数据表,上面有几个银行账户的日常交易。我想计算一段时间内每天每个银行账户的交易总额。对于在这段时间内没有交易的日子,我希望看到一个空值 我使用两个表:一个是事务数据表,另一个是日历表 我能够用下面显示的代码为单个帐户获得所需的结果。ZWID是银行帐户的IDTsql 从单个数据表中写入每个帐户的所有期间天数,tsql,Tsql,我有一个数据表,上面有几个银行账户的日常交易。我想计算一段时间内每天每个银行账户的交易总额。对于在这段时间内没有交易的日子,我希望看到一个空值 我使用两个表:一个是事务数据表,另一个是日历表 我能够用下面显示的代码为单个帐户获得所需的结果。ZWID是银行帐户的ID WITH sum_transactions as ( SELECT csd.ZWID, csd.ValueDate, sum_total = sum(csd.amount) FROM myDataBase.CashData
WITH sum_transactions as
(
SELECT csd.ZWID, csd.ValueDate, sum_total = sum(csd.amount)
FROM myDataBase.CashData as csd
WHERE csd.ValueDate > '20190131' and csd.ValueDate <= '20190208'
AND csd.ZWID IN (1592)
GROUP BY csd.ZWID, csd.ValueDate
)
SELECT st.zwid, cal.Calendar_Date, st.sum_total
FROM treasury.dbo.calendar as cal
LEFT JOIN sum_transactions as st on st.ValueDate = cal.Calendar_Date
WHERE cal.Calendar_Date > '20190131' and cal.Calendar_Date<= '20190208'
ORDER BY 1, 2
i、 e.在此期间,该特定银行账户有两天的交易
现在,当我将第二个帐户ID 1593添加到IN语句中时,我希望在2月1日到2月8日期间获得第二组8个新行,两个帐户的总和或空值总计为16行
但是,我现在得到一个结果表,除了两个帐户都没有显示任何事务的两天之外,第一个帐户不再显示具有空值的行
zwid Calendar_date sum_total
NULL 2019-02-02 NULL
NULL 2019-02-03 NULL
1592 2019-02-04 -600000
1592 2019-02-01 606174,09
1593 2019-02-01 -847958,75
1593 2019-02-04 303105,26
1593 2019-02-05 -285312,64
1593 2019-02-06 502762,95
1593 2019-02-07 405372,02
1593 2019-02-08 326213,87
显然,我没有成功地让查询分别为每个帐户写入所有日期
我需要如何更改我的查询,使其通过一个银行帐户运行,写入期间值的所有天数或NULL,然后再转到下一个帐户
更新:我正在查看大量银行账户。帐户的数量会随着时间的推移而变化我认为这可能是您所需要的,请尝试一下,然后告诉我。但基本上,我必须对您要查找的ID/日期的完整列表使用交叉应用程序,然后我使用您的其余代码来获得您想要的结果:
DROP TABLE IF EXISTS #Test;
DROP TABLE IF EXISTS #FullCalendar;
CREATE TABLE #Test
(
ZWID INT ,
ValueDate DATE ,
Amount MONEY
);
INSERT INTO #Test ( ZWID ,
ValueDate ,
Amount )
VALUES ( 1, '20190101', 100.00 ) ,
( 1, '20190101', 75.00 ) ,
( 1, '20190108', 75.00 ) ,
( 1, '20190110', 50.00 ) ,
( 2, '20190101', 25.00 ) ,
( 2, '20190102', 35.00 ) ,
( 2, '20190103', 50.00 ) ,
( 2, '20190103', 125.00 ) ,
( 3, '20190102', 150.00 ) ,
( 3, '20190109', 100.00 ) ,
( 3, '20190110', 75.00 ) ,
( 3, '20190110', 75.00 );
SELECT dd.Date, t.ZWID
INTO #FullCalendar
FROM dbo.DateDimension AS dd
CROSS APPLY #Test AS t
WHERE dd.Date >= '20190101' AND dd.Date < '20190111'
GROUP BY dd.Date ,
t.ZWID
--SELECT * FROM #FullCalendar ORDER BY ZWID, Date
;WITH sum_trans AS (
SELECT
t.ZWID, t.ValueDate, sum_total = SUM(t.Amount)
FROM #Test AS t
GROUP BY t.ZWID ,
t.ValueDate )
SELECT fc.Date, fc.ZWID, st.sum_total
FROM #FullCalendar AS fc
LEFT OUTER JOIN sum_trans AS st ON st.ZWID = fc.ZWID AND fc.Date = st.ValueDate
ORDER BY fc.ZWID,fc.Date;
把我以前的答案也留在这里
通过使用2个CTE和一个UNION ALL,我能够获得您想要的结果:
WITH sum_transactions as
(
SELECT csd.ZWID, csd.ValueDate, sum_total = sum(csd.amount)
FROM myDataBase.CashData as csd
WHERE csd.ValueDate > '20190131' and csd.ValueDate <= '20190208'
AND csd.ZWID IN (1592)
GROUP BY csd.ZWID, csd.ValueDate
) ,
WITH sum_transactions2 as
(
SELECT csd.ZWID, csd.ValueDate, sum_total = sum(csd.amount)
FROM myDataBase.CashData as csd
WHERE csd.ValueDate > '20190131' and csd.ValueDate <= '20190208'
AND csd.ZWID IN (1593)
GROUP BY csd.ZWID, csd.ValueDate
)
SELECT st.zwid, cal.Calendar_Date, st.sum_total
FROM treasury.dbo.calendar as cal
LEFT JOIN sum_transactions as st on st.ValueDate = cal.Calendar_Date
WHERE cal.Calendar_Date > '20190131' and cal.Calendar_Date<= '20190208'
ORDER BY 1, 2
UNION ALL
SELECT st.zwid, cal.Calendar_Date, st.sum_total
FROM treasury.dbo.calendar as cal
LEFT JOIN sum_transactions2 as st on st.ValueDate = cal.Calendar_Date
WHERE cal.Calendar_Date > '20190131' and cal.Calendar_Date<= '20190208'
ORDER BY 1, 2
谢谢你,米斯诺尔!我忘了强调我正在查看大量的银行账户。账户数量也会定期变化。因此,您的方法对于数量有限且稳定的帐户来说是完美的,但恐怕它还不能完全解决我的问题。我认为我的最新答案会有所帮助-如果没有,请告诉我。@MISNole:那太棒了!这正是我一直在寻找的!谢谢你的支持!
WITH sum_transactions as
(
SELECT csd.ZWID, csd.ValueDate, sum_total = sum(csd.amount)
FROM myDataBase.CashData as csd
WHERE csd.ValueDate > '20190131' and csd.ValueDate <= '20190208'
AND csd.ZWID IN (1592)
GROUP BY csd.ZWID, csd.ValueDate
) ,
WITH sum_transactions2 as
(
SELECT csd.ZWID, csd.ValueDate, sum_total = sum(csd.amount)
FROM myDataBase.CashData as csd
WHERE csd.ValueDate > '20190131' and csd.ValueDate <= '20190208'
AND csd.ZWID IN (1593)
GROUP BY csd.ZWID, csd.ValueDate
)
SELECT st.zwid, cal.Calendar_Date, st.sum_total
FROM treasury.dbo.calendar as cal
LEFT JOIN sum_transactions as st on st.ValueDate = cal.Calendar_Date
WHERE cal.Calendar_Date > '20190131' and cal.Calendar_Date<= '20190208'
ORDER BY 1, 2
UNION ALL
SELECT st.zwid, cal.Calendar_Date, st.sum_total
FROM treasury.dbo.calendar as cal
LEFT JOIN sum_transactions2 as st on st.ValueDate = cal.Calendar_Date
WHERE cal.Calendar_Date > '20190131' and cal.Calendar_Date<= '20190208'
ORDER BY 1, 2