【问题标题】:SQL query. How to count the number of entries by monthSQL 查询。如何按月计算条目数
【发布时间】:2022-01-21 21:36:06
【问题描述】:

我有一个包含 3 个月数据的交易表:

查询:

SELECT a.branch,
       a.dt_acc,
       a.ct_id,
       TRUNC(a.date, 'MONTH'),
       COUNT(*) a_count
  FROM a_transactions a
 WHERE a.v_date BETWEEN '01.03.2019' and '31.05.2019'
 GROUP BY a.branch, a.dt_acc, a.ct_id, TRUNC(a.date, 'MONTH');

结果:

BRANCH ACC ID TRUNC(A.DATE,'MONTH') A_COUNT
1 3 154 01.03.2019 1
1 3 154 01.04.2019 1
1 3 154 01.05.2019 1

每个月,a_count 打印一条记录。 我需要a_count来统计前几个月的金额,即如果3月份a_count等于1,4月份也有记录,a_count应该已经是2,如果5月份也有记录,那么a_count应该是 3

我需要这个结果:

BRANCH ACC ID TRUNC(A.DATE,'MONTH') A_COUNT
1 3 154 01.03.2019 1
1 3 154 01.04.2019 2
1 3 154 01.05.2019 3

【问题讨论】:

  • 您可以使用窗口函数来获取运行总计
  • 你有权限在你的数据库上创建表吗?

标签: sql oracle plsql


【解决方案1】:

您在这里描述的正是滑动窗口函数。语法可能会因您的 sql 方言而有所不同,但通常您可以使用:

select a.branch, a.dt_acc, a.ct_id, trunc(a.date,'MONTH'), 
count(*) over (order by a.date rows between unbounded preceding and current row) a_count
from a_transactions a
where a.v_date between '01.03.2019' and '31.05.2019'
group by a.branch, a.dt_acc, a.ct_id, trunc(a.date,'MONTH');

【讨论】:

    【解决方案2】:

    您可以像这样使用累积和:

    WITH YOUR_SQL AS (
            SELECT A.BRANCH, A.DT_ACC, A.CT_ID, TRUNC(A.DATE,'MONTH') MM , COUNT(*) A_COUNT
    FROM A_TRANSACTIONS A
    WHERE A.V_DATE BETWEEN '01.03.2019' AND '31.05.2019'
    GROUP BY A.BRANCH, A.DT_ACC, A.CT_ID, TRUNC(A.DATE,'MONTH')
        )
    SELECT Y.* , SUM (A_COUNT) OVER (ORDER BY MM,BRANCH,DT_ACC,CT_ID) CUM_SUM
    FROM YOUR_SQL Y
    

    【讨论】:

      【解决方案3】:

      您可以直接使用(无需子查询)SUM(COUNT()) OVER () 作为解析函数,例如

      SELECT branch,
             dt_acc,
             ct_id,
             TO_CHAR("date", 'yyyy') AS year,
             TRUNC("date", 'MONTH') AS first_day_of_month,
             COUNT(*) AS a_count,
             SUM(COUNT(*)) OVER 
             (PARTITION BY TO_CHAR("date", 'yyyy') 
                  ORDER BY TRUNC("date", 'MONTH')) AS a_count_sum
        FROM a_transactions
       WHERE v_date BETWEEN date'2019-03-01' and date'2019-05-31'
       GROUP BY branch, dt_acc, ct_id, TO_CHAR("date", 'yyyy'), TRUNC("date", 'MONTH')
      

      在哪里

      • 使用date'yyyy-mm-dd'格式是一个好习惯,以防止 日期文字问题与数据库的日期设置无关
      • date 是保留字,除非被引用,否则不能用作列名(例如,您的列假定为 "date"
      • 考虑其他年份也是一个好主意。也许你的 即将到来的数据将传播超过一年(例如,日期间隔可能会延长到超过一年)。

      【讨论】:

        猜你喜欢
        • 2020-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多