我在 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 中是否有可能有一个选择查询返回以下输出?
transid amount harry mark richard ,.....
1 2000 400 1200 400
2 150 30 90 30
3 300 60 180 60
.
.
.
股东人数不固定
最佳答案
为此使用动态 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 |
Here is SQLFiddle demo
To simplify things on the calling end you can wrap it up in a stored procedure
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 演示
关于mysql - 选择行值作为 mysql select 中的列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19994718/