2016-12-07 3 views
1


Hallo alle zusammen, Ich habe diese Besucher Tabelle:Count Monatsbesucher basierend auf ihren Zweck

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 

Derzeit verwende ich diese Anfrage:

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 

ich nur Monat bekommen können und Gesamtzahl der Spalten aus der obigen Abfrage. Wie kann ich diese Ausgabe erreichen?

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

Vielen Dank!

+0

Tipp: Shop Daten mit Ein Datumsdatentyp – Strawberry

Antwort

0

Betrachten Sie die folgende ...

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

..oder (und meiner Meinung nach besser, sofern Sie Zugriff auf Anwendungscode haben) ...

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

Vielen Dank! es funktioniert jetzt. – ian

0

Transponieren von Tabellen ist nicht sehr schnell. Es ist besser, dies in einem kleinen Programm zu tun.

Wenn Sie tun

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 

Sie werden einen guten Ausgangspunkt haben. Möglicherweise müssen Sie eine ORDER BY-Klausel hinzufügen (abhängig von Ihrem DBMS).

Wenn (und nur wenn) Sie nur zwei Zwecke in Ihrer Tabelle haben und die Tabelle nicht sehr groß ist, können Sie zwei Ansichten erstellen und sie verbinden.

+0

Das Transponieren von Tabellen ist möglicherweise nicht schnell. Abfragen, die keine Indizes verwenden können, sind definitiv langsam. – Strawberry

+0

Keine Diskussion darüber. Aber wenn Sie die Tabelle transponieren möchten und 50 Zwecke haben, brauchen Sie ziemlich viele Joins. Dies wird die Strafe erhöhen, einen Index nicht um den Faktor 50 verwenden zu können. – Ronald

+0

Vielen Dank für die Antwort, derzeit habe ich nur drei Zwecke. – ian

Verwandte Themen