我需要查找上个月开票金额大于 0 且当月未开票的用户数

Posted

技术标签:

【中文标题】我需要查找上个月开票金额大于 0 且当月未开票的用户数【英文标题】:I need to find the number of users that were invoiced for an amount greater than 0 in the previous month and were not invoiced in the current month 【发布时间】:2020-08-27 11:52:02 【问题描述】:

我需要找出上个月开具发票金额大于 0 且当月未开具发票的用户数量。此计算将在单个查询中完成 12 个月。输出应如下所示。

月数

01/07/2019 50

2019 年 1 月 8 日 34 日

2019 年 1 月 9 日 23 日

2019 年 1 月 10 日 98

2019 年 1 月 11 日 10 日

2019 年 1 月 12 日 5

2020 年 1 月 1 日 32 日

01/02/2020 65

2020 年 1 月 3 日 23 日

2020 年 1 月 4 日 12 日

01/05/2020 64

2020 年 1 月 6 日 54

01/07/2020 78

我只能获得一个月的价值。我想在一个查询中获得所有月份的数据。

这是我当前的查询:

SELECT COUNT(DISTINCT TWO_MONTHS_AGO.USER_ID), TWO_MONTHS_AGO.MONTH AS INVOICE_MONTH
FROM (
    SELECT USER_ID, LAST_DAY(invoice_ct_dt)) AS MONTH
    FROM table a AS ID
        WHERE invoice_amt > 0
        AND LAST_DAY(invoice_ct_dt)) = ADD_MONTHS(LAST_DAY(CURRENT_DATE - 1), - 2)
    GROUP BY user_id
    ) AS TWO_MONTHS_AGO
LEFT JOIN (
    SELECT user_id,LAST_DAY(invoice_ct_dt)) AS MONTH
    FROM table a AS ID
    AND LAST_DAY(invoice_ct_dt)) = ADD_MONTHS(LAST_DAY(CURRENT_DATE - 1), - 1)
    GROUP BY USER_ID
    ) AS ONE_MONTH_AGO ON TWO_MONTHS_AGO.USER_ID = ONE_MONTH_AGO.USER_ID
WHERE ONE_MONTH_AGO.USER_ID IS NULL
GROUP BY INVOICE_MONTH;

提前谢谢你。 洛娜

【问题讨论】:

【参考方案1】:

可能有很多不同的方法,但我的做法如下:

    按用户和月份汇总过去 13 个月的数据(您需要 12 个月加上上个月到第一个月的数据 将“本”月(有数据)与“下”月进行比较,并选择没有“下”月数据的记录 按月份和不同的用户 ID 汇总此数据集

例如,假设创建的表如下:

create table INVOICE_DATA (
USERID varchar(4),
INVOICE_DT date,
INVOICE_AMT NUMBER(10,2)
);

以下查询应为您提供您想要的 - 您可能需要根据您的计算是否包括本月或仅到上个月月底等来调整它:

--Summarise data by user and month
WITH MONTH_SUMMARY AS 
(
  SELECT USERID
  ,TO_CHAR(INVOICE_DT,'YYYY-MM') "INVOICE_MONTH"
  ,TO_CHAR(ADD_MONTHS(INVOICE_DT,1),'YYYY-MM') "NEXT_MONTH"
  ,SUM(INVOICE_AMT) "MONTHLY_TOTAL"
  FROM INVOICE_DATA
  WHERE INVOICE_DT >= TRUNC(ADD_MONTHS(current_date(),-13),'MONTH') -- Last 13 months of data
  GROUP BY 1,2,3
),
--Get data for users with invoices in this month but not the next month
USER_DATA AS 
  (
  SELECT USERID, INVOICE_MONTH, MONTHLY_TOTAL
  FROM MONTH_SUMMARY MS_THIS
  WHERE NOT EXISTS 
  (
    SELECT USERID
    FROM MONTH_SUMMARY MS_NEXT
    WHERE 
      MS_THIS.USERID = MS_NEXT.USERID AND
      MS_THIS.NEXT_MONTH = MS_NEXT.INVOICE_MONTH
   )
   AND MS_THIS.INVOICE_MONTH < TO_CHAR(current_date(),'YYYY-MM') -- Don't include this month as obviously no next month to compare to 
)
SELECT INVOICE_MONTH, COUNT(DISTINCT USERID) "USER_COUNT"
FROM USER_DATA
GROUP BY INVOICE_MONTH
ORDER BY INVOICE_MONTH
 ;

【讨论】:

以上是关于我需要查找上个月开票金额大于 0 且当月未开票的用户数的主要内容,如果未能解决你的问题,请参考以下文章

[易飞]自动生产采购发票开票数量翻倍(缺乏事务管理缺陷)

[易飞]自动生产采购发票开票数量翻倍(缺乏事务管理缺陷)

税控开票软件 发票导入工具

ABAP VF01 / VF04销售开票增强 增加校验

ABAP VF01 / VF04销售开票增强 增加校验

ABAP VF01 / VF04销售开票增强 增加校验