【问题标题】:How to calculate Day total as well as Monthly Total in the same Row如何计算同一行中的日总计和月总计
【发布时间】:2018-11-15 06:19:16
【问题描述】:

我需要获得小额现金的每日总金额(我已经收到了)并且需要与今天的帐户代码相关的每月总金额。下面我将展示每日总计的 SQL。有人请帮我计算同一行中的每月总计。

SELECT DPetAcNo as AcNo,
   SUM(DPetAmount) as DayTotal
   FROM PettyDetail
   WHERE DPetComCode='15'
         and DPetLocCode='01'
         and DPetDate=CONVERT(date,'20181113',111)
         GROUP BY DPetAcNo

上述查询的结果如下所示

根据结果 2018/11/13 AcNo 009111 Total = 22,995.00 009111 的实际累计 (2018/11/01 - 2018/11/13) 总计 = 136,265.42

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    regbas 答案的修改版本应该会表现得更好,因为它不考虑这么多行:

    SELECT DPetAcNo as AcNo,
       SUM(case when DPetDate=CONVERT(date,'20181113',111) then DPetAmount else 0 end) as DayTotal,
       SUM(DPetAmount) as MonthTotal
       FROM PettyDetail
       WHERE DPetComCode='15'
             and DPetLocCode='01'
             and DPetDate >= '2018-11-01'
             AND DPetDate < '2018-12-01'
             AND DPetAcNo IN (select dpetacno from pettydetail WHERE DPetComCode='15'
             and DPetLocCode='01'
             and DPetDate = '2018-11-13')
             GROUP BY DPetAcNo
    

    如果你想跳过 CONVERT 代码混乱,Sqlserver 会隐式地将“yyyy-mm-dd”字符串转换为日期。拥有涵盖日期、comcode、loccode、帐户和金额的索引也会有所帮助

    ——

    解决此问题的另一种方法是使用您似乎已经为 daytotal 和 cumtotal 编写的查询,如下所示:

    Select * from
    (/*Insert your query that does daytotal into these brackets*/) d
    Inner join
    (/*Insert your query that does cumtotal into these brackets*/) c
    ON d.DPetAcNo = c.dpetacno
    

    【讨论】:

      【解决方案2】:

      试试这个

      SELECT DPetAcNo as AcNo,
         SUM(case when DPetDate=CONVERT(date,'20181113',111) then DPetAmount else 0 end) as DayTotal,
         SUM(case when month(DPetDate)= 11 then DPetAmount else 0 end) as MonthTotal
         FROM PettyDetail
         WHERE DPetComCode='15'
               and DPetLocCode='01'
               GROUP BY DPetAcNo
      

      【讨论】:

      • 亲爱的 RegBes,是的,我得到了结果。但我只需要与 TODAY'S DPeAcNo 相关的每月总数。您的解决方案计算与 11 月份相关的所有表 DPeAcNo。
      • @mark 公平地对待 regbas,3 位不同的专业人士都以同样的方式误解了这个问题,所以这可能不是一个明确的要求.. 检查更新的答案(我的和松鼠)来解决要求
      【解决方案3】:

      我假设您的 DPetDate 是 Date 或 Datetime 数据类型。

      您需要过滤从每月 1 日到所需日期的行。 对于同一结果的日和月总计,请在 SUM () 中使用 CASE

      SELECT DPetAcNo as AcNo,
         SUM(CASE WHEN DPetDate  = '20181113' THEN DPetAmount ELSE 0 END) as DayTotal,
         SUM(DPetAmount) as MonthTotal,
         FROM PettyDetail
         WHERE DPetComCode='15'
               and DPetLocCode='01'
               and DPetDate >= '20181101'   -- from 1st of Nov
               and DPetDate <= '20181113'   -- to   13  of Nov
               GROUP BY DPetAcNo
      

      编辑 1: 仅根据所需日期选择 AccNo。使用子查询获取月份总计。或者你也可以在CROSS APPLY

      SELECT  *,
             ( SELECT SUM(DPetAmount) 
               FROM   PettyDetail x 
               WHERE  x.DPetAcNo = p.AcNo 
               AND    x.DPetComCode = '15' 
               AND    x.DPetLocCode = '01'
               AND    x.DPetDate >= '20180101' 
               AND    x.DPetDate <= '20181113') as MonthTotal
      FROM
      (
          SELECT DPetAcNo as AcNo,
             SUM(CASE WHEN DPetDate  = '20181113' THEN DPetAmount ELSE 0 END) as DayTotal
             FROM PettyDetail p
             WHERE DPetComCode='15'
                   and DPetLocCode='01'
                   and DPetDate = '20181113'   -- for 13  of Nov only
                   GROUP BY DPetAcNo
      ) p
      

      【讨论】:

      • “伟大的思想家想法相似......傻瓜很少不同!” :)
      • 亲爱的松鼠,感谢您的回复。您的结果也显示非今天的 AcNo 总数。我只需要相关 AcNo 的今天总数和累计总数。不适用于其他 AcNos
      • Euww .. 将相关查询放在选择块中?从来没有想过你会这样做!
      • 或者CROSS APPLY
      • 我要洗眼睛:)
      【解决方案4】:

      自我加入怎么样?

      SELECT 
          DPetAcNo AcNo
      ,   DayTotal
      ,   SUM(DPetAmount) MonthlyTotal
      FROM PettyDetail pd
      JOIN (
          SELECT 
              DPetAcNo AcNo
          ,   SUM(DPetAmount) DayTotal
          FROM 
              PettyDetail
          WHERE 
              DPetComCode='15'
          AND DPetLocCode='01'
          AND DPetDate = CONVERT(DATE,'20181113',111)
          GROUP BY DPetAcNo
      ) pd2 ON pd2.AcNo = dp.DPetAcNo
      WHERE 
          MONTH(DPetDate) = MONTH(CONVERT(DATE,'20181113',111)) 
      AND YEAR(DPetDate)  = YEAR(CONVERT(DATE,'20181113',111))
      GROUP BY DPetAcNo, DayTotal
      

      【讨论】:

      • 亲爱的 iSR5,您的解决方案仅创建 AcNo 和 MonthlyTotal。没有 DayTotal 创建。
      • @Mark 已修复,现在检查。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多