Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 包含3个表的透视表_Mysql_Sql_Pivot - Fatal编程技术网

Mysql 包含3个表的透视表

Mysql 包含3个表的透视表,mysql,sql,pivot,Mysql,Sql,Pivot,我正在尝试从三个表生成透视图: 学生 费用 种马费(关系表) 各表: Students Table +----+-----------+-----------+----------------+----------------+-------+ | id | school_id | last_name | first_name | middle_initial | yrlvl | +----+-----------+-----------+----------------+-------

我正在尝试从三个表生成透视图:

  • 学生
  • 费用
  • 种马费(关系表)
  • 各表:

    Students Table
    +----+-----------+-----------+----------------+----------------+-------+
    | id | school_id | last_name | first_name     | middle_initial | yrlvl |
    +----+-----------+-----------+----------------+----------------+-------+
    |  1 | 2080295   | Doe       | John           | A              |     3 |
    |  2 | 0239129   | Rizal     | Jose           | M              |     4 |
    |  3 | 1231238   | Santos    | Jane           | M              |     2 |
    +----+-----------+-----------+----------------+----------------+-------+
    
    Fee table
    +----+--------------------+------------+
    | id | fee_name           | fee_amount |
    +----+--------------------+------------+
    |  1 | Registration Fee   |        100 |
    |  2 | News Letter        |        100 |
    |  3 | T-Shirt            |        250 |
    |  4 | Party              |        500 |
    +----+--------------------+------------+
    
    stud_fee table
    +----+------------+-----+
    | id | stud_id | fee_id |
    +----+---------+--------+
    |  1 |       1 |      1 |
    |  2 |       1 |      2 |
    |  3 |       1 |      3 |
    |  4 |       2 |      1 |
    |  5 |       3 |      1 |
    |  6 |       3 |      4 |
    +----+---------+--------+
    
    我想把费用作为列,学生作为行。 我想将其显示为:

    +-----------+------------------+-------------+---------+-------+-------+
    | school_id | Registration Fee | News Letter | T-Shirt | Party | Total |
    +-----------+------------------+-------------+---------+-------+-------+
    | 2080295   |              100 |         100 |     250 |       |   450 |
    | 0239129   |              100 |             |         |       |   100 |
    | 1231238   |              100 |             |         |   500 |   600 |
    +-----------+------------------+-------------+---------+-------+-------+
    
    试试这个:

    SELECT 
      s.school_id,
      MAX(CASE WHEN f.fee_name = 'Registration Fee' THEN f.fee_amount END) 
        AS 'Registration Fee',
      MAX(CASE WHEN f.fee_name = 'News Letter'      THEN f.fee_amount END) 
        AS 'News Letter',
      MAX(CASE WHEN f.fee_name = 'T-Shirt'          THEN f.fee_amount END) 
        AS 'T-Shirt',
      MAX(CASE WHEN f.fee_name = 'Party'            THEN f.fee_amount END) 
        AS 'Party',
      SUM(f.fee_amount) AS Total
    FROM Students s
    INNER JOIN stud_fee sf 
            ON s.Id = sf.stud_id
    INNER JOIN fee f       
           ON sf.fee_id = f.id
    GROUP BY s.school_id
    

    看起来您可能有未知数量的费用要转换为列,如果是这种情况,则您需要使用准备好的语句来查询:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when f.fee_name = ''',
          f.fee_name,
          ''' then f.fee_amount else 0 end) AS `',
          f.fee_name, '`'
        )
      ) INTO @sql
    FROM fee f;
    
    SET @sql = CONCAT('SELECT s.school_id, ', @sql, '
                        , sum(f.fee_amount) as Total
                      FROM students s
                      LEFT JOIN stud_fee sf
                        on s.id = sf.stud_id
                      LEFT JOIN fee f
                        on sf.fee_id = f.id
                       GROUP BY s.school_id');
    
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
    请参见

    可能的重复:可能的重复