首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户总数,从MySQL中指定期间起每个月的发票计数

用户总数,从MySQL中指定期间起每个月的发票计数
EN

Stack Overflow用户
提问于 2013-05-29 13:50:06
回答 1查看 3.1K关注 0票数 0

我对mysql查询有问题,希望有人能帮我。

我有以下表格:

代码语言:javascript
复制
CREATE TABLE USER
(
ID VARCHAR(80) NOT NULL, 
REGISTRATION_DATE DATE NOT NULL,
..... 
PRIMARY KEY(ID)
);

CREATE TABLE INVOICES
(
USER_ID VARCHAR(80) NOT NULL,
INVOICE_NUMBER VARCHAR(50) NOT NULL,
CREATION_DATE DATE NOT NULL,
........
PRIMARY KEY(USER_ID, INVOICE_NUMBER),
FOREIGN KEY(USER_ID) REFERENCES USER(ID)
);

我需要以下功能:我选择开始日期和结束日期(时间段),例如01.02.2013-31.05.2013作为查询的参数,并希望看到:

  1. 从所选期间起每个月的用户总数(!)不是每个月的计数,而是最多(包括)月的用户总数。)
  2. 每个月至少创建一张发票的用户数量。
  3. 每个月的发票清点(此处为每月计票)。

示例:期间: 01.02.2013-31.05.2013结果集:

代码语言:javascript
复制
Month | Year | Total count of users | Count of users who created at least one invoice in this month | Count of invoices in this month
Febr  |  2013  |  20  |  12  |  45
March |  2013  |  20  |  4   |  22
April |  2013  |  23  |  20  |  30
May   |  2013  |  28  |  27  |  69

写这样的查询可以吗?我试过这样做:

代码语言:javascript
复制
SELECT YEAR, MONTH, @VAR := @VAR + TOTS.COUNT AS USERS_TOTAL
FROM (
    SELECT
        YEAR(REGISTRATION_DATE) AS YEAR,
        MONTH(REGISTRATION_DATE) AS MONTH,
        COUNT(ID) AS COUNT
    FROM USER
WHERE REGISTRATION_DATE <= '2013-05-31'
    GROUP BY YEAR, MONTH
) AS TOTS, (SELECT @VAR := 0) AS INC

我得到的用户总数,但只有当有一些新的注册用户。我是说,如果Ferb的用户总数。三月是二十,四月二十一日,我得到二月。

通过这个查询,我可以得到创建至少一张发票的用户的计数,但是如果计数与前几个月的计数相同,则没有任何信息:

代码语言:javascript
复制
SELECT YEAR(CREATION_DATE) as YEAR, MONTH(CREATION_DATE) as MONTH,
 COUNT(DISTINCT CUSTOMER_ID) 
FROM INVOICES
WHERE CREATION_DATE >= '2013-02-01' AND CREATION_DATE <='2013-05-31'
GROUP BY YEAR, MONTH

通过这个查询,我可以得到选择期内每个月的发票数量:

代码语言:javascript
复制
SELECT YEAR(CREATION_DATE) as YEAR, MONTH(CREATION_DATE) as MONTH, COUNT(INVOICE_NUMBER) 
FROM INVOICES
WHERE CREATION_DATE >= '2013-02-01' AND CREATION_DATE <='2013-05-31'
GROUP BY YEAR, MONTH

我想在一个查询中完成这个任务,就像我说的那样,希望每个月都有信息,即使信息与前一个月相同。我怎样才能达到我想要的结果,任何想法?

EN

回答 1

Stack Overflow用户

发布于 2013-05-29 14:43:46

分别生成它们中的每一个都非常简单。但是,如果您想将它们放在一个查询中,这可能会很麻烦。最好是分几个步骤来完成。但这是我的尝试

代码语言:javascript
复制
SELECT 
       extract(MONTH FROM i.date) AS MONTH, 
       extract(YEAR FROM i.date) AS YEAR, count(i.*) AS Count_Invoices, 
       count(user.*) as count_users, 
      CASE (WHERE i.* IS NOT NULL COUNT u.id END) AS active_users_this_month

FROM 
      invoices I RIGHT JOIN users u

GROUP BY 
      Year, Month
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16815743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档