我需要找到上个月开具发票金额大于0且在当月未开具发票的用户数量

问题描述

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

月数

01/07/2019 50

01/08/2019 34

01/09/2019 23

01/10/2019 98

01/11/2019 10

01/12/2019 5

2020年1月1日32

2020年2月1日65

01/03/2020 23

01/04/2020 12

01/05/2020 64

2020年6月1日54

2020年1月7日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个月以及该月的前一个月
  2. 将“具有数据的本月”与“下一个月”进行比较,并选择没有“下一个月”数据的记录
  3. 按月份和不同的用户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
 ;