Mysql 根据目的统计每月的访客数量
Mysql 根据目的统计每月的访客数量,mysql,count,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/20
大家好, 我有一张访客桌:
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
谢谢 对表的转换不是很快。最好在一些小程序中这样做 如果你做了一个
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
你会有一个很好的起点。
您可能需要添加ORDERBY子句(取决于您的DBMS)
如果(且仅当)您的表中只有两个目的,并且表的大小不太大,则可以创建两个视图并将它们连接起来。对表的转换不是很快。最好在一些小程序中这样做 如果你做了一个
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
你会有一个很好的起点。
您可能需要添加ORDERBY子句(取决于您的DBMS)
如果(且仅当)您的表中只有两个目的,并且表的大小不是很大,则可以创建两个视图并将它们连接起来。考虑以下几点
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 |
+---------+----------+----------+-------+
…或者(在我看来,最好是您可以访问应用程序代码)
考虑以下几点
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 |
+---------+----------+----------+-------+
…或者(在我看来,最好是您可以访问应用程序代码)
提示:使用日期数据类型存储日期提示:使用日期数据类型存储日期转换表可能不快。不能使用索引的查询速度肯定很慢。没有讨论这个问题。但是如果你想转置这个表,并且恰好有50个目的,你将需要相当多的连接。这将使不能使用索引的惩罚增加50倍。谢谢你的回答,目前我只有三个目的在索引良好的环境中,大量的连接不应该是一个太大的问题。然而,出于不同的原因,我同意您的观点,即转换最好在应用程序代码中完成。转换表可能不会很快。不能使用索引的查询速度肯定很慢。没有讨论这个问题。但是如果你想转置这个表,并且恰好有50个目的,你将需要相当多的连接。这将使不能使用索引的惩罚增加50倍。谢谢你的回答,目前我只有三个目的在索引良好的环境中,大量的连接不应该是一个太大的问题。然而,出于不同的原因,我同意您的观点,即换位最好在应用程序代码中完成。