Reputation: 319
I have this table called "downloads" composed like this
id date name quantity
1 2015-05-13 23:30:09 CRCP03 - Cartoon Race Car Pack 03 1
2 2015-05-14 00:30:09 CRCPV2-01 - Cartoon Race Cars Pack V2 - 01 1
3 2015-05-14 17:10:06 CRCP03 - Cartoon Race Car Pack 03 1
4 2015-05-15 23:47:07 CRCPV2-01 - Cartoon Race Cars Pack V2 - 01 1
5 2015-05-16 03:31:06 CRCP03 - Cartoon Race Car Pack 03 1
6 2015-05-17 13:13:06 CRCP03 - Cartoon Race Car Pack 03 1
7 2015-05-18 00:32:06 CRCPV2-01 - Cartoon Race Cars Pack V2 - 01 1
I want to SUM
all the "name"
by DAYNAME
while having an interval DATE_SUB(curdate(), INTERVAL 1 MONTH)
.
Also the sum to be name aware
Currenty what I have is this
SELECT name, SUM(quantity), DAYNAME(d.date) AS weekday
FROM downloads d
GROUP BY WEEKDAY(d.date)
/*// This does not work I get a fetch_assoc error also does not have a time interval
SELECT WEEKDAY(d.date) AS weekday,
SUM(CASE WHEN d.name = 'CRCP03 - Cartoon Race Car Pack 03' THEN 1 ELSE 0 END) AS a,
SUM(CASE WHEN d.name = 'CRCPV2-01 - Cartoon Race Cars Pack V2 - 01' THEN 1 ELSE 0 END) AS b,
FROM downloads d
GROUP BY WEEKDAY(d.date) */
I get this kind of mixed result without interval
Monday - CRCP03 - Cartoon Race Car Pack 03 - 70
Tuesday - CRCPV2-01 - Cartoon Race Cars Pack V2 - 01 - 72
Wednesday - CRCP03 - Cartoon Race Car Pack 03 - 89
Thursday - CRCP03 - Cartoon Race Car Pack 03 - 77
Friday - CRCP03 - Cartoon Race Car Pack 03 - 70
Saturday - CRCP03 - Cartoon Race Car Pack 03 - 68
Sunday - CRCPV2-01 - Cartoon Race Cars Pack V2 - 01 - 49
Thank you for anyone carrying to help
Upvotes: 0
Views: 77
Reputation: 16730
To get the number of times each name appears for each weekday, you can use the aggregation you already have, but group by both name and weekday:
SELECT DAYNAME(dateColumn) AS weekDay, name, SUM(quantity) AS totalCount
FROM downloads
GROUP BY DAYNAME(dateColumn), name;
To only select on an interval, you can just add a where clause. For example, if I wanted to do this only for the month of may:
SELECT DAYNAME(dateColumn) AS weekDay, name, SUM(quantity) AS totalCount
FROM downloads
WHERE dateColumn BETWEEN '2015-05-01' AND '2015-05-31'
GROUP BY DAYNAME(dateColumn), name;
If you want to see the names side by side, with each row for a weekday, you need to look into a pivot table, which is hard to do. However, if you know the row names, you can use conditional aggregation:
SELECT DAYNAME(dateColumn) AS weekday,
SUM(name = 'CRCPV2-01 - Cartoon Race Cars Pack V2 - 01') AS 'CRCPV2-01 - Cartoon Race Cars Pack V2 - 01',
SUM(name = 'CRCP03 - Cartoon Race Car Pack 03') AS 'CRCP03 - Cartoon Race Car Pack 03'
FROM downloads
WHERE dateColumn BETWEEN '2015-05-01' AND '2015-05-31'
GROUP BY DAYNAME(dateColumn);
Both queries can be seen in action at this SQL Fiddle.
Upvotes: 1