Выберите значения строк для заголовков столбцов в mysql select

У меня есть две таблицы в MySql,

shareholders 

 id name value
 1 harry 20
 2 mark 60
 3 richard 20

вторая таблица

transactions 
 id date amount
 1 2013-11-01 2000
 2 2013-11-01 150
 3 2013-11-01 300
 4 2013-11-02 700
 5 2013-11-02 5400

первая таблица содержит процент, в котором сумма транзакций делится. возможно ли в MySQL выбрать запрос select, который вернет следующий результат?

transid amount harry mark richard ,.....
1 2000 400 1200 400
2 150 30 90 30
3 300 60 180 60
.
.
.

количество акционеров не установлено

1 ответ

Используйте динамический SQL для этого

SET @sql = NULL;

SELECT GROUP_CONCAT(CONCAT(
 'MAX(CASE WHEN h.id = ', id, 
 ' THEN amount * ', value / 100, 
 ' END) '', name, '''))
 INTO @sql
 FROM shareholders;

SET @sql = CONCAT(
 'SELECT t.id transaction_id, t.date, t.amount, ', @sql, 
 ' FROM transactions t CROSS JOIN shareholders h 
 GROUP BY t.id');

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

Вывод:

| TRANSACTION_ID | DATE | AMOUNT | HARRY | MARK | RICHARD |
|----------------|------------|--------|-------|------|---------|
| 1 | 2013-11-01 | 2000 | 400 | 1200 | 400 |
| 2 | 2013-11-01 | 150 | 30 | 90 | 30 |
| 3 | 2013-11-01 | 300 | 60 | 180 | 60 |
| 4 | 2013-11-02 | 700 | 140 | 420 | 140 |
| 5 | 2013-11-02 | 5400 | 1080 | 3240 | 1080 |

Вот демоверсия SQLFiddle

Чтобы упростить работу на вызывающем конце, вы можете завершить его в хранимой процедуре

DELIMITER $$
CREATE PROCEDURE shareholders_report()
BEGIN
 SET @sql = NULL;

 SELECT GROUP_CONCAT(CONCAT(
 'MAX(CASE WHEN h.id = ', id, 
 ' THEN amount * ', value / 100, 
 ' END) '', name, '''))
 INTO @sql
 FROM shareholders;

 SET @sql = CONCAT(
 'SELECT t.id transaction_id, t.date, t.amount, ', @sql, 
 ' FROM transactions t CROSS JOIN shareholders h 
 GROUP BY t.id');

 PREPARE stmt FROM @sql;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

И затем используйте его:

CALL shareholders_report();

Вот демоверсия SQLFiddle

licensed under cc by-sa 3.0 with attribution.