2016-12-07 84 views
1


大家好, 我有這樣的訪客表:計數每月訪問者人數

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 

謝謝!

+0

提示:商店使用日期日期數據類型 – Strawberry

回答

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 | 
+---------+----------+-------+ 
+0

非常感謝!它現在正在工作。 – ian

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)。

如果(且僅當)您的表中只有兩個目的,且表的大小不是很大,則可以創建兩個視圖並加入它們。

+0

轉置表可能並不快。不能使用索引的查詢肯定很慢。 – Strawberry

+0

沒有關於這個問題的討論。但是如果你想轉換桌面並碰巧有50個目的,你將需要相當多的連接。這會增加不能使用索引的懲罰因子爲50. – Ronald

+0

感謝您的回答,目前我只有三個目的 – ian