【问题标题】:run the join when the group by value has changed当按值分组已更改时运行联接
【发布时间】:2013-08-11 05:22:02
【问题描述】:

您好,我正在编写以下查询,但结果不是我需要的

第 1 节

选择 case_PrimaryCompanyId 为 companyid, 转换(VARCHAR(7),ca.case_createddate,111)作为日期, 'Moving Balance' 作为 InvoiceType, 总和(mb.Amount)作为金额 来自 ca 的案例

第 2 节

左连接 ( 选择 case_PrimaryCompanyId 为 companyid, 案例创建日期, case_TotalExVat 作为金额 来自案例)mb 约case_primaryCompanyId = mb.companyid 和 ca.case_createdDate >= mb.case_CreatedDate 在哪里 ca.case_primaryCompanyId = companyid 通过...分组 case_primaryCompanyId, 转换(VARCHAR(7),ca.case_createddate,111)

好的,所以上面会得到一个如下的数据列表,并按月和年分组,并汇总自时间开始以来的数量。

日期 实际金额 2009 年 10 月 20 日 1766.52 2009 年 7 月 11 日 2778.02 14/01/2010 -2700.00 28/02/2010 -78.02 27/05/2010 2489.40 2010 年 5 月 27 日 2491.20 2010 年 5 月 30 日 2494.80

一切正常,计算每个月的累积值。

直到我到 2010 年 5 月,然后为可能的每条记录计算移动余额,而不是可能的一次(而不是在组值更改时仅计算一次)

动平衡结果 日期显示应该是 2009/10 1766.52 1766.52 2009/11 2788.02 2788.02 2010/01 78.02 78.02 2010/02 0.00 0.00 2010/05 22426.20 7475.50

试过了 sum(distinct mb.Amount) 但这不起作用

任何想法都将不胜感激 谢谢 雷切尔

【问题讨论】:

  • 看起来您正在使用 SQL Server。哪个版本?

标签: sql


【解决方案1】:

如果您将生成结果集的查询放入with 子句中

;with results as 
(
     select 
          convert(varchar(4),YEAR(date)) + right('00'+convert(varchar(2),MONTH(date)),2) m, 
          sum(amount) a 
     from 
          (-- your results here ) data 
     group by YEAR(date), MONTH(date)
)
select 
     *,
     (select SUM(a) from results r1 where r1.m<=results.m)
from results
order by m

【讨论】:

  • 感谢 podiluska,打算研究一下,这似乎相当简单,从未听说过 with 子句,如果它有效,会告诉你。谢谢
  • 嗨 Podiluska 我试过了,但我得到了相同的结果,我需要按结果区分还是什么?
  • 根据定义,group by 结果将始终为 distinct
  • 那我很困惑,因为如果一个月有 3 条记录,总和要计算 3 次。我不知道为什么会这样,因为我会假设 group by 使一切都不同,但我的结果仍然不正确。
  • @Rachsherry 我已经更新了答案,使其独立。你应该能够运行它。您的代码有何不同?
【解决方案2】:

在经历了很多挫折和几个星期的头发拉扯之后,

我终于解决了这个问题,

我取出了join,只用了一个select语句

( 选择 case_PrimaryCompanyId 为 companyid, 转换(VARCHAR(7),case_createddate,111)作为日期, case_invoicetype 作为 InvoiceType, Sum(case_totalexvat) 作为金额 来自案例 AS ca 在哪里 datediff(m,case_createddate,getDate()) = CONVERT(VARCHAR(7),b.case_createddate, 111) 和 b.case_primarycompanyid = a.case_primarycompanyid )PrevSum 从案例一 在哪里 转换(VARCHAR(7),a.case_createddate,111)>转换(VARCHAR(7),DATEADD(m,-13,current_timestamp),111) 按 a.case_primarycompanyid 分组,CONVERT(VARCHAR(7),a.case_createddate, 111) ) 按日期、发票类型排序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2016-05-12
    相关资源
    最近更新 更多