【问题标题】:Total user count, invoice count for each month from specified period in MySQLMySQL 中指定期间每个月的总用户数、发票数
【发布时间】:2013-05-24 19:44:57
【问题描述】:

我有一个mysql查询问题,希望有人帮助我。

我有以下表格:

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 结果集:

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

是否可以编写这样的查询? 我试过这个:

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 的用户总数。 3 月是 20 日,4 月 21 日,我得到 二月。 - 20,没有 3 月和 4 月 21 日的信息,我需要所选期间每个月的信息。

通过此查询,我得到了创建至少一张发票的用户计数,但如果计数与前几个月的计数相同 - 无信息:

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

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

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

我想在单个查询中完成这项工作,并且正如我所说,希望每个月都有信息,即使信息与上个月相同。 我怎样才能达到我想要的结果,有什么想法吗?

【问题讨论】:

    标签: mysql sql count


    【解决方案1】:

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

    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
    

    【讨论】:

    • 谢谢!但我害怕,它不起作用。而不是“date”,它应该是“creation_date”,而不是“I”,它应该是“i”。更正此问题后,它不再起作用。我得到的错误是:“') AS Count_Invoices, count(user.) as count_users, CASE (WHE' at line 3 附近的 SQL 语法错误”
    • kk 让我再想想……你有一些我可以玩的样本数据吗?
    • 你可以用一些测试数据进行测试,这不是那么重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多