Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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查询DATEDIFF-如何?_Sql_Sql Server - Fatal编程技术网

基于逻辑加法条件的SQL查询DATEDIFF-如何?

基于逻辑加法条件的SQL查询DATEDIFF-如何?,sql,sql-server,Sql,Sql Server,我如何编写一个查询,计算从另一个表添加到一个单元格值所需的时间 例如,在下面两个表中,我想从表2中用户A的借记开始,并从表1中计算从借记日期算起,用户A需要向后多少天才能累积到表2中的值 Date User Credits Apr 30 A 25 Apr 30 B 75 May 1 A 25 May 2 A 25 May 2 B 75 May 3 A 50 May 3 B 75

我如何编写一个查询,计算从另一个表添加到一个单元格值所需的时间

例如,在下面两个表中,我想从表2中用户A的借记开始,并从表1中计算从借记日期算起,用户A需要向后多少天才能累积到表2中的值

Date    User    Credits
Apr 30  A       25
Apr 30  B       75
May 1   A       25
May 2   A       25
May 2   B       75
May 3   A       50
May 3   B       75

Date    User    Debits
May 4   B       150
May 5   A       100
我想从表2中每个用户的借方值开始,计算从借方日期向后多少天才能达到该贷方金额。在这种情况下,我寻找的用户A的结果是5-5天达到100。这需要适用于多个用户。用户B的结果应该是3-3天,从5月4日返回到5月2日,以达到150

我对如何开始感到困惑。解决方案是一组IF语句吗

样本结果:

 Debit Date User    Debit Amount    Days Back of Credits
 4-May      B       150             3
 5-May      A       100             5
试试这个

cte是为了找到累积平衡

; with cte as
(
    select  [User]      = t2.[User], 
            Debit_Date  = t2.[Date], 
            Debit_Amt   = t2.[Debits],
            Credit_Date = t1.[Date],
            Balance     = t2.[Debits] - SUM(t1.[Credits]) OVER (PARTITION BY t2.[Date] ORDER BY t1.[Date])
    from    table2 t2
            inner join table1 t1    on  t2.[User]   = t1.[User]
)
select  [User], 
        Debit_Date, 
        Debit_Amt, 
        [Days] = datediff(day, min(Credit_Date), Debit_Date) + 1
from    cte
where   Balance     >= 0
group by [User], Debit_Date, Debit_Amt

我认为您的日期差异是错误的,但表A中的两个日期是正确的

与我的结果进行验证,并与其他样本日期进行测试,并让我知道

declare @TableA table(Dates date,Users varchar(50),Credits int)
insert into @TableA VALUES
('2017-Apr-30','A',25)
,('2017-Apr-30','B',75)
,('2017-May-1 ','A',25)
,('2017-May-2 ','A',25)
,('2017-May-2 ','B',75)
,('2017-May-3 ','A',50)
,('2017-May-3 ','B',75)


declare @TableB table(Dates date,Users varchar(50),Debit int)
insert into @TableB VALUES
('2017-May-4','B',150)
,('2017-May-5','A',100)

;with CTE as
(
select  A.Dates,A.Users
,(select sum(A1.Credits) from @TableA A1 
where a1.dates<=a.dates 
and a1.users=a.users)cr
from @TableA A
)
,CTE1 AS(
select b.Dates  [Debit Date],b.Users
,b.Debit [Debit Amount]
,(
select top 1 c.dates
from cte c where 
b.Users=c.users and c.cr>=b.Debit
)CreditDates
from @TableB B
)

select   [Debit Date],Users,[Debit Amount]
,datediff(day,CreditDates,[Debit Date])[Days Back of Credits]
,CreditDates -- just for test
from cte1

但3天内,A的总数加起来是100。那为什么是5?同时将更多用户的样本数据放在两个表中,所有用户的预期输出是什么?5是从借方日期(5月5日)开始的倒计时。如果表1的日期范围超出表2的范围,会发生什么情况?这样就可以了。我想从一个选定的借方开始,在本例中是5月5日的100,然后从贷方表的5月5日开始倒数,直到5月5日或更早的时候,总计到100为止。我仍然无法理解倒数的逻辑。我建议为其他用户提供更详细的示例数据,谢谢!我所要做的只是将a翻转,并在CTE1中添加一个orderby。它起作用了!你也很摇滚!这很有帮助。我认为要让它工作,我需要做的就是添加一个子CTE来选择我需要的前1个值。非常感谢!它还不能让我给你打分,因为我的声望还不到15。