根据目的计算每月访客数量

时间:2016-12-07 14:52:22

标签: mysql count


大家好, 我有这个访客表:

ID | Date | Purpose
1 | 20/10/2016 | Purpose1
2 | 22/10/2016 | Purpose1
3 | 25/10/2016 | Purpose2
4 | 12/11/2016 | Purpose1
5 | 14/11/2016 | Purpose2
6 | 16/11/2016 | Purpose2

目前我正在使用此查询:

select case
            when date like '%/10/2016' then '10/2016'
            when date like '%/11/2016' then '11/2016'
        end as month, count(*) as total 
        from visitors 
        where 
            date like '%/10/2016' 
            or date like '%/11/2016' 
        GROUP by month

我只能从上面的查询中获得月份和总列数。我怎样才能实现这个输出?

Month | Total | Purpose1 | Purpose2
10/2016 | 3 | 2 | 1
11/2016 | 3 | 1 | 2

谢谢!

2 个答案:

答案 0 :(得分:0)

转置表格并不是非常快。最好在一些小程序中这样做。

如果你做了

select case
            when date like '%/10/2016' then '10/2016'
            when date like '%/11/2016' then '11/2016'
        end as month, count(*) as total, Purpose 
        from visitors 
        where 
            date like '%/10/2016' 
            or date like '%/11/2016' 
        GROUP by month, Purpose

你有一个很好的起点。 您可能需要添加ORDER BY子句(取决于您的DBMS)。

如果(且仅当)你的表中只有两个目的而且表格的大小不大,你可以创建两个视图并加入它们。

答案 1 :(得分:0)

考虑以下内容......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,Date DATE NOT NULL
,Purpose VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1,'2016-10-20','Purpose1'),
(2,'2016-10-22','Purpose1'),
(3,'2016-10-25','Purpose2'),
(4,'2016-11-12','Purpose1'),
(5,'2016-11-14','Purpose2'),
(6,'2016-11-16','Purpose2');

SELECT DATE_FORMAT(date,'%Y-%m') month
     , SUM(purpose = 'purpose1') purpose1
     , SUM(purpose = 'purpose2') purpose2
     , COUNT(*) total 
  FROM my_table 
 GROUP 
    BY month;
+---------+----------+----------+-------+
| month   | purpose1 | purpose2 | total |
+---------+----------+----------+-------+
| 2016-10 |        2 |        1 |     3 |
| 2016-11 |        1 |        2 |     3 |
+---------+----------+----------+-------+

..或(在我看来,如果您可以访问应用程序代码,那就更好了......)

SELECT DATE_FORMAT(date,'%Y-%m') month
     , purpose
     , COUNT(*) total
  FROM my_table
 GROUP 
    BY month
     , purpose;

+---------+----------+-------+
| month   | purpose  | total |
+---------+----------+-------+
| 2016-10 | Purpose1 |     2 |
| 2016-10 | Purpose2 |     1 |
| 2016-11 | Purpose1 |     1 |
| 2016-11 | Purpose2 |     2 |
+---------+----------+-------+