4

Possible Duplicate:
Combine Multiple child rows into one row MYSQL

I have following table,

count     | inventory_id | resource_id | id
---------+-----------+----------------------
10        | 1            | 1           | 1
20        | 2            | 1           | 2
30        | 1            | 2           | 3
40        | 2            | 2           | 4

I want to merge rows where resource_id is equal and also want to give alias for each count according to inventory_id. I need to give alias "Resource 1" for count where inventory_id =1 and "Resource 2" where inventory_id=2

output needed:

Resource 1| Resource 2    |resource_id 
---------+-----------+-----------------
10        | 20            | 1             
30        | 40            | 2             
Community
  • 1
  • 1
RP89
  • 141
  • 1
  • 4
  • 16

2 Answers2

3
SELECT
  MAX(CASE WHEN inventory_id = 1 THEN `count` END) AS 'Resource 1',
  MAX(CASE WHEN inventory_id = 2 THEN `count` END) AS 'Resource 2',
  resource_id
FROM table 
GROUP BY resource_id

SQL Fiddle DEMO

This should give you:

RESOURCE 1  RESOURCE 2  RESOURCE_ID
10             20                1
30             40                2
Mahmoud Gamal
  • 78,257
  • 17
  • 139
  • 164
2

Try

SELECT
  resource_id,
  MAX(CASE WHEN inventory_id = 1 THEN `count` ELSE NULL END) AS 'Resource 1',
  MAX(CASE WHEN inventory_id = 2 THEN `count` ELSE NULL END) AS 'Resource 2'
FROM table1
GROUP BY resource_id

SQLFiddle Demo

but if you have unknown value of inventory_id not just (1 and 2), better use PreparedStatement

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN inventory_id = ',
      inventory_id,
      ' THEN `count` ELSE NULL END) AS ''RESOURCE ',
      inventory_id, ''''
    )
  ) INTO @sql
FROM table1;

SET @sql = CONCAT('SELECT resource_id, ', @sql, ' 
                   FROM table1 
                   GROUP BY resource_id');

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

SQLFiddle Demo

John Woo
  • 258,903
  • 69
  • 498
  • 492