2016-03-21 54 views
0

该查询给了我,我需要让动态的,所以当年列没有硬编码:总和由每个用户,用户组,动态列年度每年

SELECT u.last_name as 'Name', 
COUNT(e.user_id) as 'Total', 
SUM(CASE WHEN YEAR(e.datetime)=2012 THEN 1 END) as '2012', 
SUM(CASE WHEN YEAR(e.datetime)=2013 THEN 1 END) as '2013', 
SUM(CASE WHEN YEAR(e.datetime)=2014 THEN 1 END) as '2014', 
SUM(CASE WHEN YEAR(e.datetime)=2015 THEN 1 END) as '2015', 
SUM(CASE WHEN YEAR(e.datetime)=2016 THEN 1 END) as '2016' 
FROM entries e, users u 
WHERE e.user_id = u.user_id 
GROUP BY e.user_id 

有没有办法动态创建年份列,并使用mysql动态地将它们求和?我当然可以用一些PHP来做,但是想知道在纯MySQL中是否可行。

当前查询输出是这样的:

Name Total 2012 2013 2014 2015 2016 
Smith 568 186 124 162 75 21 
Jones 579 188 156 160 68 7 
+1

你不能,真。这是一个数据透视查询,并且mysql不直接支持它们。你有什么是标准的解决方法,正如你所看到的,它不能是动态的。改为使用客户端代码。它会简化您的查询 –

+0

Gotchya。马克,谢谢,谢谢。 –

回答

1

你可以循环轮的结果是这样

$d = 2016; 
$string = ''; 
for($i = 2012; $i <= $d; $i ++) { 
    $string .= "SUM(CASE WHEN YEAR(e.datetime)=$i THEN 1 END) as '$i'"; 
} 

然后将其添加到查询

SELECT u.last_name as 'Name', 
COUNT(e.user_id) as 'Total', 
    '.$string.' 
FROM entries e, users u 
WHERE e.user_id = u.user_id 
GROUP BY e.user_id 
+0

是的,我想知道是否有本地的mysql方式来实现相同的事情,但这很容易。谢谢! –