选择行值作为mysql select中的列标题

选择行值作为mysql select中的列标题,mysql,sql,Mysql,Sql,我在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

我在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
.
.
.        

股东人数不是固定的

为此使用动态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 | 然后使用它:

CALL shareholders_report();

下面是演示

使用动态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 | 然后使用它:

CALL shareholders_report();

这里是演示

非常感谢@peterm它就像一个魔咒@不客气。好运:)我遇到了一个问题,我可以用上面的代码创建一个视图吗?我在创建视图时出错<代码>您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解第2行“SET@sql=NULL”附近使用的正确语法@indago不,您不能。MySQL既不允许来自的
子查询,也不允许动态SQL(
PREPARE
和所有内容)非常感谢@peterm,它的工作非常有魅力@不客气。好运:)我遇到了一个问题,我可以用上面的代码创建一个视图吗?我在创建视图时出错<代码>您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解第2行“SET@sql=NULL”附近使用的正确语法
@indago不,您不能。MySQL既不允许在
FROM
中进行子查询,也不允许动态SQL(
PREPARE
和all)