Reputation: 35
There are 2 Database table like below there Table_1 & Table_2. Is it possible to fetch the query result as a table matrix based on the 2 fields on different tables?
Table_1
| ID_PRODUCT | NAME_PRODUCT |
|------------ |-------------- |
| 1 | PRODUCT A |
| 2 | PRODUCT B |
| 3 | PRODUCT C |
Table_2
| ID_SURVEY | ID_PRODUCT | TOTAL SALES |
|----------- |------------ |------------- |
| 1 | 1 | 10 |
| 1 | 2 | 20 |
| 2 | 2 | 30 |
| 2 | 3 | 40 |
| 3 | 3 | 50 |
Expected Output:
| ID_SURVEY | PRODUCT A | PRODUCT B | PRODUCT C |
|----------- |----------- |----------- |----------- |
| 1 | 10 | 20 | 0 |
| 2 | 0 | 30 | 40 |
| 3 | 0 | 0 | 50 |
Upvotes: 1
Views: 393
Reputation: 12378
If table_1
has fixed product, you can do it like this,
select
ID_SURVEY,
max(case when ID_PRODUCT = 1 then `TOTAL SALES` else 0 end) as `PRODUCT A`,
max(case when ID_PRODUCT = 2 then `TOTAL SALES` else 0 end) as `PRODUCT B`,
max(case when ID_PRODUCT = 3 then `TOTAL SALES` else 0 end) as `PRODUCT C`
from Table_2
group by ID_SURVEY
But here you have to use dynamic sql to do this:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN t2.ID_PRODUCT = ',
t2.ID_PRODUCT,
' THEN t2.`TOTAL SALES` ELSE 0 END) AS `',
t1.NAME_PRODUCT, '`'
)
) INTO @sql
FROM Table_2 t2
JOIN Table_1 t1
ON t2.ID_PRODUCT = t1.ID_PRODUCT;
SET @sql = CONCAT('SELECT t2.ID_SURVEY, ', @sql,
' FROM Table_2 t2
JOIN Table_1 t1
ON t2.ID_PRODUCT = t1.ID_PRODUCT
GROUP BY t2.ID_SURVEY');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Upvotes: 1