【问题标题】:Having trouble with recursive SQL over time随着时间的推移,递归 SQL 出现问题
【发布时间】:2016-04-25 12:11:12
【问题描述】:

我正在重写我们的一个内部财务系统。我正在设置的是这个新系统每个月都会对订单表进行快照,并在该快照的日期。这部分效果很好。

下一步是创建一个视图,其中将包含每个月的总计以及上个月的总计。

当我按团队和月份进行总计时,设置递归没有问题。我只是自然地加入团队,month=month-1(我为该月设置了一个单独的表,并带有一个身份以使生活更轻松)

我遇到的问题是,如果我尝试在进行连接的同时进行递归。我再次加入团队和一个月,但由于某种原因我最终以交叉加入。是否有一个简单的理由来查看导致交叉连接的原因?有人在我的逻辑中看到错误吗? 这是连接:

select SH1.month, SH1.Team,
   sum(SH2.Monthly_SAMT) as BilledPrevious, sum(SH1.Monthly_SAMT) as BilledCurrent,
   sum(SH1.Monthly_SAMT) - sum(SH2.MonthlyAnnualized_SAMT) BILLEDDIFF
from vw_SalesMonthly2 SH1 full outer join vw_SalesMonthly2 SH2
   on SH1.team=SH2.team and SH1.month_index-1 = SH2.month_index
group by SH1.month, SH1.Team
order by 1 desc, 2 asc

【问题讨论】:

标签: sql sql-server join recursion


【解决方案1】:

您希望在加入之前按月汇总数据以获取前几个月的数据。因此,您需要在加入之前进行分组。

另外,我认为你想要一个左连接而不是全外连接。您希望每个月/团队有一行,如果存在的话,每行都有上个月的数据,对吗?

这是一个玩具示例:

declare @sales table (id int identity, team integer, mon integer, value money)
insert @sales (team, mon, value) values 
    (1,1,0),
    (1,2,100),
    (1,3,150),
    (2,1,40),
    (2,2,99)

; with cte as (
    select team, mon, sum(value) [value]
    from @sales
    group by team, mon
)
select s1.team, s1.mon, s1.value, s2.value [previous]
from cte s1
left join cte s2 on s1.team=s2.team and s1.mon=s2.mon+1
order by 1 asc, 2 asc

输出:

team        mon         value                 previous
----------- ----------- --------------------- ---------------------
1           1           0.00                  NULL
1           2           100.00                0.00
1           3           150.00                100.00
2           1           40.00                 NULL
2           2           99.00                 40.00

【讨论】:

    【解决方案2】:

    我想你可以在这里使用OUTER APPLY 来获取之前的总和。

    SELECT  SH1.month,
            SH1.Team,
            COALESCE(SH2.Monthly_SAMT,0) AS BilledPrevious,
            SUM(SH1.Monthly_SAMT) AS BilledCurrent,
            SUM(SH1.Monthly_SAMT) - COALESCE(SH2.MonthlyAnnualized_SAMT,0) BILLEDDIFF
    FROM    vw_SalesMonthly2 SH1
            OUTER APPLY (SELECT SUM(SH2.Monthly_SAMT) Monthly_SAMT,
                                SUM(SH2.MonthlyAnnualized_SAMT) MonthlyAnnualized_SAMT
                         FROM   vw_SalesMonthly2 SH2
                         WHERE  SH1.team = SH2.team
                                AND SH1.month_index - 1 = SH2.month_index
                        ) SH2
    GROUP BY SH1.month,
            SH1.Team,
            SH2.Monthly_SAMT,
            SH2.MonthlyAnnualized_SAMT
    ORDER BY 1 DESC,
            2 ASC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      相关资源
      最近更新 更多