2012-11-19 53 views
2

我有一個數據庫(MySQL的5.5),一組與此類似:多計數和

ID Name Page Visited Date 
1  Tim  Page A   11-2-2000 
1  Tim  Page B   11-3-2000 
1  Tim  Page B   11-3-2000 
2  Jeff Page C   11-5-2000 
2  Jeff Page A   11-11-2000 

我想建立一個查詢(目前努力),其中效果也與此類似:

ID Name Page A Visits Page B Visits Page C Visits 
1  Tim   1    2    0 

我認爲我需要對一個子集運行以下查詢(我的問題是我怎麼做這與基本3個字)?:

SELECT * From database.mytable GROUP BY ID HAVING COUNT(*) >=1 
+0

看一看這些鏈接:[自動旋轉表查詢](http:// w [動態數據透視表](http://buysql.com/mysql/14-how-to-automate-pivot-tables.html)。 – Devart

回答

6
SELECT ID, Name, 
     SUM(CASE WHEN `Page Visited` = 'Page A' THEN 1 ELSE 0 END) `Page A Visit`, 
     SUM(CASE WHEN `Page Visited` = 'Page B' THEN 1 ELSE 0 END) `Page B Visit`, 
     SUM(CASE WHEN `Page Visited` = 'Page C' THEN 1 ELSE 0 END) `Page C Visit` 
FROM tableName 
GROUP BY ID, Name 
如果你有數目不詳的 page

,你也可以PreparedStatement

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'SUM(CASE WHEN `Page Visited` =''', 
     `Page Visited`, 
     ''' then 1 ELSE 0 end) AS ', 
     CONCAT('`',`Page Visited`, ' Visits`') 
    ) 
) INTO @sql 
FROM TableName; 

SET @sql = CONCAT('SELECT ID, Name, ', @sql, ' 
        FROM tableName 
        GROUP BY ID, Name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+1

+1 - 幾乎沒有認出新的名字:) – RocketDonkey

+0

謝謝!使用Fiddles和Prepared Statement選項的優秀補充 – user82302124

+0

@ user82302124 [這裏是另一個頁面的示例,但查詢仍未使用preparedstatement:D](http://sqlfiddle.com/#!2/20522/1) –