使用MySQL和PHP的Pivot报表

使用MySQL和PHP的Pivot报表,php,mysql,oop,pivot,Php,Mysql,Oop,Pivot,我有3个mysql表,如下所示: 表-01:公司 id | comp_name | year ------------------------ 1 | Novartis | 2015 2 | Roche | 2015 3 | Glaxco | 2015 表-02:产品 id | fullname 1 | Paracetamol 2 | Eesomaprazol 3 | Phenobuterol 表-03:投标 id | comp_id | prod_id | r

我有3个mysql表,如下所示: 表-01:公司

id | comp_name | year
------------------------
 1 | Novartis  | 2015
 2 | Roche     | 2015
 3 | Glaxco    | 2015
表-02:产品

id | fullname
 1 | Paracetamol
 2 | Eesomaprazol 
 3 | Phenobuterol
表-03:投标

id | comp_id | prod_id | rate | year
 1 |       1 |       1 |  2.0 | 2015
 2 |       1 |       2 |  4.2 | 2015
 3 |       1 |       3 |  2.3 | 2015
 4 |       2 |       1 |  3.0 | 2015
 5 |       2 |       2 |  4.0 | 2015
 6 |       2 |       3 |  2.5 | 2015
 7 |       3 |       1 |  2.3 | 2015
 8 |       3 |       2 |  4.5 | 2015
 9 |       3 |       3 |  2.8 | 2015
从以上三个表中,我想得到以下由php获取的汇总表:

fullname     | Novartis | Roche | Glaxco
Paracetamol  |      2.0 |   3.0 | 2.3
Eesomaprazol |      4.2 |   4.0 | 4.5 
Phenobuterol |      2.3 |   2.5 | 2.8
关于如何使用MySQL表和prepared语句从php创建pivot报告,我不太清楚。另外,我必须从php端(而不是MySQL端的SQL查询)实现这一点


我不知道如何实现这一点,尽管我知道基本的MySQL查询,并且可以获取和获取普通的MySQL数据。但是,如果我能从上述三个表的数据中得到一个实用的想法,我可以从任何大型和复杂的数据结构入手。

您必须动态生成要透视的列,您可以在mysql中使用:

#1st part
SET @sql = NULL;

SELECT GROUP_CONCAT(
    DISTINCT CONCAT('sum(case when comp_name = ''', comp_name, ''' then rate else 0 end) as ',
                    replace(comp_name, ' ', ''))
)
INTO @sql
FROM company;

#2nd part
SET @sql = CONCAT('SELECT
  fullname,
  ', @sql, '
FROM bid
  JOIN product ON product.id = bid.prod_id
  JOIN company ON company.id = bid.comp_id
GROUP BY fullname');

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

说明:

#第一部分

此部分生成SQL以求和费率并生成列标题,因此在
@SQL
中,您将有:

sum(case when comp_name = 'Novartis' then rate else 0 end) as Novartis,sum(case when comp_name = 'Roche' then rate else 0 end) as Roche,sum(case when comp_name = 'Glaxco' then rate else 0 end) as Glaxco
#第二部分

该部分生成并执行主查询,主查询生成输出


和输出(对我而言):


PHP代码(我想您正在使用PDO):

和输出:

Array
(
    [0] => Array
        (
            [fullname] => Eesomaprazol
            [Novartis] => 4.2
            [Roche] => 4
            [Glaxco] => 4.5
        )

    [1] => Array
        (
            [fullname] => Paracetamol
            [Novartis] => 2
            [Roche] => 3
            [Glaxco] => 2.3
        )

    [2] => Array
        (
            [fullname] => Phenobuterol
            [Novartis] => 2.3
            [Roche] => 2.5
            [Glaxco] => 2.8
        )

)

变量
@sql
在当前数据库连接中可见,因此您可以使用它。

您必须动态生成要透视的列,您可以在mysql上使用它:

#1st part
SET @sql = NULL;

SELECT GROUP_CONCAT(
    DISTINCT CONCAT('sum(case when comp_name = ''', comp_name, ''' then rate else 0 end) as ',
                    replace(comp_name, ' ', ''))
)
INTO @sql
FROM company;

#2nd part
SET @sql = CONCAT('SELECT
  fullname,
  ', @sql, '
FROM bid
  JOIN product ON product.id = bid.prod_id
  JOIN company ON company.id = bid.comp_id
GROUP BY fullname');

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

说明:

#第一部分

此部分生成SQL以求和费率并生成列标题,因此在
@SQL
中,您将有:

sum(case when comp_name = 'Novartis' then rate else 0 end) as Novartis,sum(case when comp_name = 'Roche' then rate else 0 end) as Roche,sum(case when comp_name = 'Glaxco' then rate else 0 end) as Glaxco
#第二部分

该部分生成并执行主查询,主查询生成输出


和输出(对我而言):


PHP代码(我想您正在使用PDO):

和输出:

Array
(
    [0] => Array
        (
            [fullname] => Eesomaprazol
            [Novartis] => 4.2
            [Roche] => 4
            [Glaxco] => 4.5
        )

    [1] => Array
        (
            [fullname] => Paracetamol
            [Novartis] => 2
            [Roche] => 3
            [Glaxco] => 2.3
        )

    [2] => Array
        (
            [fullname] => Phenobuterol
            [Novartis] => 2.3
            [Roche] => 2.5
            [Glaxco] => 2.8
        )

)

变量
@sql
在当前数据库连接中可见,因此您可以使用它。

您必须动态生成要透视的列,您可以在mysql上使用它:

#1st part
SET @sql = NULL;

SELECT GROUP_CONCAT(
    DISTINCT CONCAT('sum(case when comp_name = ''', comp_name, ''' then rate else 0 end) as ',
                    replace(comp_name, ' ', ''))
)
INTO @sql
FROM company;

#2nd part
SET @sql = CONCAT('SELECT
  fullname,
  ', @sql, '
FROM bid
  JOIN product ON product.id = bid.prod_id
  JOIN company ON company.id = bid.comp_id
GROUP BY fullname');

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

说明:

#第一部分

此部分生成SQL以求和费率并生成列标题,因此在
@SQL
中,您将有:

sum(case when comp_name = 'Novartis' then rate else 0 end) as Novartis,sum(case when comp_name = 'Roche' then rate else 0 end) as Roche,sum(case when comp_name = 'Glaxco' then rate else 0 end) as Glaxco
#第二部分

该部分生成并执行主查询,主查询生成输出


和输出(对我而言):


PHP代码(我想您正在使用PDO):

和输出:

Array
(
    [0] => Array
        (
            [fullname] => Eesomaprazol
            [Novartis] => 4.2
            [Roche] => 4
            [Glaxco] => 4.5
        )

    [1] => Array
        (
            [fullname] => Paracetamol
            [Novartis] => 2
            [Roche] => 3
            [Glaxco] => 2.3
        )

    [2] => Array
        (
            [fullname] => Phenobuterol
            [Novartis] => 2.3
            [Roche] => 2.5
            [Glaxco] => 2.8
        )

)

变量
@sql
在当前数据库连接中可见,因此您可以使用它。

您必须动态生成要透视的列,您可以在mysql上使用它:

#1st part
SET @sql = NULL;

SELECT GROUP_CONCAT(
    DISTINCT CONCAT('sum(case when comp_name = ''', comp_name, ''' then rate else 0 end) as ',
                    replace(comp_name, ' ', ''))
)
INTO @sql
FROM company;

#2nd part
SET @sql = CONCAT('SELECT
  fullname,
  ', @sql, '
FROM bid
  JOIN product ON product.id = bid.prod_id
  JOIN company ON company.id = bid.comp_id
GROUP BY fullname');

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

说明:

#第一部分

此部分生成SQL以求和费率并生成列标题,因此在
@SQL
中,您将有:

sum(case when comp_name = 'Novartis' then rate else 0 end) as Novartis,sum(case when comp_name = 'Roche' then rate else 0 end) as Roche,sum(case when comp_name = 'Glaxco' then rate else 0 end) as Glaxco
#第二部分

该部分生成并执行主查询,主查询生成输出


和输出(对我而言):


PHP代码(我想您正在使用PDO):

和输出:

Array
(
    [0] => Array
        (
            [fullname] => Eesomaprazol
            [Novartis] => 4.2
            [Roche] => 4
            [Glaxco] => 4.5
        )

    [1] => Array
        (
            [fullname] => Paracetamol
            [Novartis] => 2
            [Roche] => 3
            [Glaxco] => 2.3
        )

    [2] => Array
        (
            [fullname] => Phenobuterol
            [Novartis] => 2.3
            [Roche] => 2.5
            [Glaxco] => 2.8
        )

)


变量
@sql
在当前数据库连接中可见,因此您可以使用它。

好,省略了该子句,省略了该子句,省略了该子句,省略了该子句,省略了clauseI有+1您的答案。只有一件事可以改进:在您的
案例中使用id而不是comp_name
,这将在第二次请求中保存加入公司。此外,我不确定您是否应该按公司名称/id分组或按年份筛选。。。这取决于op想要什么。我不知道
案例中的yeep也可以是id列,这取决于op想要如何实现,但你有很好的观点。关于分组,我不知道OP想要什么结果,但现在只是简单的改变。无论如何,如果我能+2你的答案,我就会这么做。这根本不是我该怎么做,而是+1的努力。我有一个问题,我如何才能将公司名称作为列标题,因为公司名称在数组键中,所以我必须指定公司名称,以便从关联数组中获取数据。但是,让更多的公司,甚至是充满活力的公司,所以我不知道所有公司的名字。如果我想获取html表中的数据,那么如何才能将公司名称作为该html表的列标题?我有+1您的答案。只有一件事可以改进:在您的
案例中使用id而不是comp_name
,这将在第二次请求中保存加入公司。此外,我不确定您是否应该按公司名称/id分组或按年份筛选。。。这取决于op想要什么。我不知道
案例中的yeep也可以是id列,这取决于op想要如何实现,但你有很好的观点。关于分组,我不知道OP想要什么结果,但现在只是简单的改变。无论如何,如果我能+2你的答案,我就会这么做。这根本不是我该怎么做,而是+1的努力。我有一个问题,我如何才能将公司名称作为列标题,因为公司名称在数组键中,所以我必须指定公司名称,以便从关联数组中获取数据。但是,让更多的公司,甚至是充满活力的公司,所以我不知道所有公司的名字。如果我想获取html表中的数据,那么如何才能将公司名称作为该html表的列标题?我有+1您的答案。只有一件事可以改进:在您的
案例中使用id而不是comp_name
,这将在第二次请求中保存加入公司。此外,我不确定您是否应该按公司名称/id分组或按年份筛选。。。这取决于op想要什么。我不知道
案例中的yeep也可以是id列,这取决于op想要如何实现,但你有很好的观点。关于分组,我不知道OP想要什么结果,但现在只是简单的改变。无论如何,如果我能+2你的答案,我就会这么做。这根本不是我该怎么做,而是+1的努力。我有一个问题,我如何才能将公司名称作为列标题,因为公司名称在数组键中,所以我必须指定公司名称,以便从关联数组中获取数据。但是,让更多的公司,甚至是充满活力的公司,所以我不知道所有公司的名字。如果我想获取数据