Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Tsql 从单个数据表中写入每个帐户的所有期间天数_Tsql - Fatal编程技术网

Tsql 从单个数据表中写入每个帐户的所有期间天数

Tsql 从单个数据表中写入每个帐户的所有期间天数,tsql,Tsql,我有一个数据表,上面有几个银行账户的日常交易。我想计算一段时间内每天每个银行账户的交易总额。对于在这段时间内没有交易的日子,我希望看到一个空值 我使用两个表:一个是事务数据表,另一个是日历表 我能够用下面显示的代码为单个帐户获得所需的结果。ZWID是银行帐户的ID WITH sum_transactions as ( SELECT csd.ZWID, csd.ValueDate, sum_total = sum(csd.amount) FROM myDataBase.CashData

我有一个数据表,上面有几个银行账户的日常交易。我想计算一段时间内每天每个银行账户的交易总额。对于在这段时间内没有交易的日子,我希望看到一个空值

我使用两个表:一个是事务数据表,另一个是日历表

我能够用下面显示的代码为单个帐户获得所需的结果。ZWID是银行帐户的ID

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