This is the structure of my table:
Then I run a query
SELECT `date`,`index_name`,`results` FROM `mst_ind` WHERE `index_name` IN ('MSCI EAFE Mid NR USD', 'Alerian MLP PR USD') AND `time_period`='M1'
and get a table like
How can I convert "index_name" rows to columns like:
date | MSCI EAFE Mid NR USD | Alerian MLP PR USD etc
In other words I need each column to represent an index and rows to represent date-result. I understand that MySQL doesn't have pivot table functions. What is the easiest way of doing this?
I've tried this code, but it generates an error:
SELECT
`date`,
MAX(IF(index_name = 'Alerian MLP PR USD' AND `time_period`='M1', results, NULL)) AS res1,
MAX(IF(index_name = 'MSCI EAFE Mid NR USD' AND `time_period`='M1', results, NULL)) AS res2
FROM
`mst_ind`
GROUP BY `date
I need to make the conversion on the query level - not PHP. Please suggest a nice and elegant solution. Thanks!
Try
SELECT date,
MAX(CASE WHEN index_name = 'Alerian MLP PR USD' THEN results END) `Alerian MLP PR USD`,
MAX(CASE WHEN index_name = 'MSCI EAFE Mid NR USD' THEN results END) `MSCI EAFE Mid NR USD`
FROM mst_ind
WHERE index_name IN ('MSCI EAFE Mid NR USD', 'Alerian MLP PR USD')
AND time_period = 'M1'
GROUP BY date
Sample output:
| DATE | ALERIAN MLP PR USD | MSCI EAFE MID NR USD | |------------|--------------------|----------------------| | 1995-01-31 | -0.0167 | 0.0335 | | 1995-02-28 | 0.0128 | 0.0409 | | 1995-03-31 | 0.0464 | 0.0286 | | 1995-04-28 | 0.0331 | 0.0297 | | 1995-05-31 | 0.0069 | 0.0398 | ...
Here is SQLFiddle demo