2016-03-21 50 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方式來實現相同的事情,但這很容易。謝謝! –