I have followed a question here to use a Mysql query to dynamically convert rows to columns. This works fine, but i need to convert this on basis of two columns,
The query mentioned in above link works for a single column "data", but i want to work for two columns which are "data" and "price".
i have added an example here,
Given a table A, which look like
Table A
| id|order|data|item|Price|
-----+-----+----------------
| 1| 1| P| 1 | 50 |
| 1| 1| P| 2 | 60 |
| 1| 1| P| 3 | 70 |
| 1| 2| Q| 1 | 50 |
| 1| 2| Q| 2 | 60 |
| 1| 2| Q| 3 | 70 |
| 2| 1| P| 1 | 50 |
| 2| 1| P| 2 | 60 |
| 2| 1| P| 4 | 80 |
| 2| 3| S| 1 | 50 |
| 2| 3| S| 2 | 60 |
| 2| 3| S| 4 | 80 |
I like to write a query that looks like the following:
Result Table
| id|order1|order2|order3|item1|item2|item3|item4|
-----+-----+---------------------------------------
| 1| P | Q | | 50 | 60 | 70 | |
| 2| P | | S | 50 | 60 | | 80 |
I have tried to create two different queries and then a join to achieve this, but that may not be a good solution. Can any one suggest a solution same like mentioned in the link above.
Thanks
If you had a known number of values for both
order
anditem
, then you could hard code the query into:See Demo. But part of the problem that you are going to have is because you are trying to transform multiple columns of data. My suggestion to get the final result would be to unpivot the data first. MySQL does not have an unpivot function but you can use a UNION ALL to convert the multiple pairs of columns into rows. The code to unpivot will be similar to the following:
See Demo. The result of this will be:
As you can see this has taken the multiple columns of
order
/data
anditem
/price
and convert it into multiple rows. Once that is completed, then you can convert the values back into columns using an aggregate function with a CASE:See Demo. Finally, you need to convert the above code into a dynamic prepared statement query:
See SQL Fiddle with demo. This gives a result: