3

I want get a special result from my table and i want find out that is possible !? I have a table like this: (idA , idB , val) by this values:

idA |   idB |   val
----+-------+----------
1   |   5   |   50
1   |   6   |   0
1   |   7   |   NULL
2   |   5   |   100
2   |   6   |   12
2   |   7   |   0

I want select from this table by a format like this:

idA |   5   |   6   |   7
----+-------+-------+-------
1   |   50  |   0   |   NULL
2   |   100 |   12  |   0

How it's possible?

Note: I have some searches and find nothing, if you know a good key word it would be useful for me.

Himanshu
  • 31,810
  • 31
  • 111
  • 133
Masoud Nazari
  • 476
  • 2
  • 6
  • 17
  • 1
    You should search `pivot table`, like this: http://stackoverflow.com/questions/7674786/mysql-pivot-table – Alma Do Aug 12 '13 at 10:55

2 Answers2

4

You can try this query:

SELECT idA
  ,GROUP_CONCAT(CASE WHEN idB = 5 THEN val ELSE NULL END) AS `5`
  ,GROUP_CONCAT(CASE WHEN idB = 6 THEN val ELSE NULL END) AS `6`
  ,GROUP_CONCAT(CASE WHEN idB = 7 THEN val ELSE NULL END) AS `7`
FROM MyTable
GROUP BY idA

If you don't know the number of idB you can use this dynamic query:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'GROUP_CONCAT(CASE WHEN `idB` = ''',
      `idB`,
      ''' THEN val ELSE NULL END) AS `',
      `idB`, '`'
    )
  ) INTO @sql
FROM MyTable;

SET @sql = CONCAT('SELECT idA, ', @sql,'
                     FROM MyTable
                    GROUP BY idA
                  ');

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

Output:

| IDA |   5 |  6 |      7 |
---------------------------
|   1 |  50 |  0 | (null) |
|   2 | 100 | 12 |      0 |

See this SQLFiddle

Himanshu
  • 31,810
  • 31
  • 111
  • 133
1

you can try with this

   select idA ,
     max(CASE WHEN idB = 5 then val end) as '5',
     max(CASE WHEN idB = 6 then val end) as '6',
     max(CASE WHEN idB = 7 then val end) as '7'
     from Table1
   GROUP BY idA

DEMO HERE

Output:

| IDA |   5 |  6 |      7 |
---------------------------
|   1 |  50 |  0 | (null) |
|   2 | 100 | 12 |      0 |
echo_Me
  • 37,078
  • 5
  • 58
  • 78