我需要查找上个月开票金额大于 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 且当月未开票的用户数的主要内容,如果未能解决你的问题,请参考以下文章