问题
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.
回答1:
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
回答2:
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 |
来源:https://stackoverflow.com/questions/18185167/fetch-table-rows-in-columns