user82302124
user82302124

Reputation: 1143

Multiple counts and a group by

I have a database (MySQL 5.5) similar to this:

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

I want to build a query (trying to at the moment), where the results would be similar to this:

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

I assume that I need to run the following query against a subset (my question is how do I do this with essentially 3 counts)?:

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

Upvotes: 2

Views: 82

Answers (1)

John Woo
John Woo

Reputation: 263693

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

if you have unknown number of page, you can also 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;

Upvotes: 6

Related Questions