Mysql 将where子句中的日期范围用作列名

Mysql 将where子句中的日期范围用作列名,mysql,Mysql,我试图动态地使用where子句日期范围内的日期作为结果中的列名。我知道我可以使用case/when语句硬编码: sum(case when day(date_accessed) = 1 THEN 1 ELSE 0 END) AS `Jan 1 2014`... 每个月这样做会很麻烦。我也知道我可以使用php或其他脚本语言来构建一个表,但我正试图在mysql中完成这一切。这是我的疑问 SELECT count(*) AS `Total Clicks`, day(date_accessed) FR

我试图动态地使用where子句日期范围内的日期作为结果中的列名。我知道我可以使用case/when语句硬编码:

sum(case when day(date_accessed) = 1 THEN 1 ELSE 0 END) AS `Jan 1 2014`...
每个月这样做会很麻烦。我也知道我可以使用php或其他脚本语言来构建一个表,但我正试图在mysql中完成这一切。这是我的疑问

SELECT count(*) AS `Total Clicks`, day(date_accessed)
FROM Client_Activity_Log a WHERE date_accessed between '2014-01-01' AND '2014-01-31'
GROUP BY day(date_accessed);
上面的查询将把每个日期放在它自己的行中并合计,但我希望每个日期都是列。我希望结果如下所示(每个月的所有天):


我可能已经找到了一个像样的解决办法。如果有人有更好的,请告诉我:

我可能已经想出了最简单的解决办法。它不会在列名中提供月份或年份,但它可能与我得到的最接近:

SELECT 
SUM(CASE WHEN day(date_accessed) = 1 THEN 1 ELSE 0 END) AS '1', 
SUM(CASE WHEN day(date_accessed) = 2 THEN 1 ELSE 0 END) AS `2`, 
SUM(CASE WHEN day(date_accessed) = 3 THEN 1 ELSE 0 END) AS `3`, 
SUM(CASE WHEN day(date_accessed) = 4 THEN 1 ELSE 0 END) AS `4`, 
SUM(CASE WHEN day(date_accessed) = 5 THEN 1 ELSE 0 END) AS `5`, 
SUM(CASE WHEN day(date_accessed) = 6 THEN 1 ELSE 0 END) AS `6`, 
SUM(CASE WHEN day(date_accessed) = 7 THEN 1 ELSE 0 END) AS `7`, 
SUM(CASE WHEN day(date_accessed) = 8 THEN 1 ELSE 0 END) AS `8`, 
SUM(CASE WHEN day(date_accessed) = 9 THEN 1 ELSE 0 END) AS `9`, 
SUM(CASE WHEN day(date_accessed) = 10 THEN 1 ELSE 0 END) AS `10`, 
SUM(CASE WHEN day(date_accessed) = 11 THEN 1 ELSE 0 END) AS `11`, 
SUM(CASE WHEN day(date_accessed) = 12 THEN 1 ELSE 0 END) AS `12`, 
SUM(CASE WHEN day(date_accessed) = 13 THEN 1 ELSE 0 END) AS `13`, 
SUM(CASE WHEN day(date_accessed) = 14 THEN 1 ELSE 0 END) AS `14`, 
SUM(CASE WHEN day(date_accessed) = 15 THEN 1 ELSE 0 END) AS `15`, 
SUM(CASE WHEN day(date_accessed) = 16 THEN 1 ELSE 0 END) AS `16`, 
SUM(CASE WHEN day(date_accessed) = 17 THEN 1 ELSE 0 END) AS `17`, 
SUM(CASE WHEN day(date_accessed) = 18 THEN 1 ELSE 0 END) AS `18`, 
SUM(CASE WHEN day(date_accessed) = 19 THEN 1 ELSE 0 END) AS `19`, 
SUM(CASE WHEN day(date_accessed) = 20 THEN 1 ELSE 0 END) AS `20`, 
SUM(CASE WHEN day(date_accessed) = 21 THEN 1 ELSE 0 END) AS `21`, 
SUM(CASE WHEN day(date_accessed) = 22 THEN 1 ELSE 0 END) AS `22`, 
SUM(CASE WHEN day(date_accessed) = 23 THEN 1 ELSE 0 END) AS `23`, 
SUM(CASE WHEN day(date_accessed) = 24 THEN 1 ELSE 0 END) AS `24`, 
SUM(CASE WHEN day(date_accessed) = 25 THEN 1 ELSE 0 END) AS `25`, 
SUM(CASE WHEN day(date_accessed) = 26 THEN 1 ELSE 0 END) AS `26`, 
SUM(CASE WHEN day(date_accessed) = 27 THEN 1 ELSE 0 END) AS `27`,
SUM(CASE WHEN day(date_accessed) = 28 THEN 1 ELSE 0 END) AS `28`,
SUM(CASE WHEN day(date_accessed) = 29 THEN 1 ELSE 0 END) AS `29`,
SUM(CASE WHEN day(date_accessed) = 30 THEN 1 ELSE 0 END) AS `30`,
SUM(CASE WHEN day(date_accessed) = 31 THEN 1 ELSE 0 END) AS `31`
FROM Client_Activity_Log a WHERE date_accessed between '2014-01-01' AND '2014-01-31';

考虑在演示席层/应用层代码中处理数据显示的问题,假设你有这个(例如,一个简单的PHP循环作用在一个有序数组上),即使你成功地做到了这一点,它也可能直接导致你的下一个问题——“我希望这些值为0的列也适用于没有条目存在的日期”。(我想你会想要的,对吧?)…你在“创建甚至不存在的数据”的领域中,使用普通查询会变得非常复杂。在处理数据IMHO之后,您最好先这样做。不要将答案放在问题中。此外,这一点以前已经得到了回答:可能重复正常情况,我不会将答案放在问题中,但它不会让我在8 ho内回答我自己的问题我来看看透视表。
SELECT 
SUM(CASE WHEN day(date_accessed) = 1 THEN 1 ELSE 0 END) AS '1', 
SUM(CASE WHEN day(date_accessed) = 2 THEN 1 ELSE 0 END) AS `2`, 
SUM(CASE WHEN day(date_accessed) = 3 THEN 1 ELSE 0 END) AS `3`, 
SUM(CASE WHEN day(date_accessed) = 4 THEN 1 ELSE 0 END) AS `4`, 
SUM(CASE WHEN day(date_accessed) = 5 THEN 1 ELSE 0 END) AS `5`, 
SUM(CASE WHEN day(date_accessed) = 6 THEN 1 ELSE 0 END) AS `6`, 
SUM(CASE WHEN day(date_accessed) = 7 THEN 1 ELSE 0 END) AS `7`, 
SUM(CASE WHEN day(date_accessed) = 8 THEN 1 ELSE 0 END) AS `8`, 
SUM(CASE WHEN day(date_accessed) = 9 THEN 1 ELSE 0 END) AS `9`, 
SUM(CASE WHEN day(date_accessed) = 10 THEN 1 ELSE 0 END) AS `10`, 
SUM(CASE WHEN day(date_accessed) = 11 THEN 1 ELSE 0 END) AS `11`, 
SUM(CASE WHEN day(date_accessed) = 12 THEN 1 ELSE 0 END) AS `12`, 
SUM(CASE WHEN day(date_accessed) = 13 THEN 1 ELSE 0 END) AS `13`, 
SUM(CASE WHEN day(date_accessed) = 14 THEN 1 ELSE 0 END) AS `14`, 
SUM(CASE WHEN day(date_accessed) = 15 THEN 1 ELSE 0 END) AS `15`, 
SUM(CASE WHEN day(date_accessed) = 16 THEN 1 ELSE 0 END) AS `16`, 
SUM(CASE WHEN day(date_accessed) = 17 THEN 1 ELSE 0 END) AS `17`, 
SUM(CASE WHEN day(date_accessed) = 18 THEN 1 ELSE 0 END) AS `18`, 
SUM(CASE WHEN day(date_accessed) = 19 THEN 1 ELSE 0 END) AS `19`, 
SUM(CASE WHEN day(date_accessed) = 20 THEN 1 ELSE 0 END) AS `20`, 
SUM(CASE WHEN day(date_accessed) = 21 THEN 1 ELSE 0 END) AS `21`, 
SUM(CASE WHEN day(date_accessed) = 22 THEN 1 ELSE 0 END) AS `22`, 
SUM(CASE WHEN day(date_accessed) = 23 THEN 1 ELSE 0 END) AS `23`, 
SUM(CASE WHEN day(date_accessed) = 24 THEN 1 ELSE 0 END) AS `24`, 
SUM(CASE WHEN day(date_accessed) = 25 THEN 1 ELSE 0 END) AS `25`, 
SUM(CASE WHEN day(date_accessed) = 26 THEN 1 ELSE 0 END) AS `26`, 
SUM(CASE WHEN day(date_accessed) = 27 THEN 1 ELSE 0 END) AS `27`,
SUM(CASE WHEN day(date_accessed) = 28 THEN 1 ELSE 0 END) AS `28`,
SUM(CASE WHEN day(date_accessed) = 29 THEN 1 ELSE 0 END) AS `29`,
SUM(CASE WHEN day(date_accessed) = 30 THEN 1 ELSE 0 END) AS `30`,
SUM(CASE WHEN day(date_accessed) = 31 THEN 1 ELSE 0 END) AS `31`
FROM Client_Activity_Log a WHERE date_accessed between '2014-01-01' AND '2014-01-31';