Php 如何将MySQL行折叠为列结果

Php 如何将MySQL行折叠为列结果,php,mysql,sql,pivot,Php,Mysql,Sql,Pivot,有一个查询,我想从中获取: 附加到当前opportunity记录的用户的用户名 与每个opportunity记录关联的销售阶段 美元与商机记录关联的金额 我想: 获取当前的IF语句结果,并将其折叠 当前查询: $sql = "SELECT u.user_name as USER, if(o.sales_stage='Prospecting', o.amount, '') as PROSPECTING, if(o.sales_st

有一个查询,我想从中获取:

  • 附加到当前opportunity记录的用户的用户名

  • 与每个opportunity记录关联的销售阶段

  • 美元
    与商机记录关联的金额

我想:

  • 获取当前的IF语句结果,并将其折叠
当前查询:

$sql = "SELECT u.user_name as USER,
               if(o.sales_stage='Prospecting', o.amount, '') as PROSPECTING,
               if(o.sales_stage='Needs Analysis', o.amount, '') as NEEDS_ANALYSIS,
               if(o.sales_stage='Closed Won', o.amount, '') as CLOSED_WON
          FROM opportunities o,
               users u
         WHERE o.assigned_user_id = u.id
      GROUP BY u.user_name ";
当前结果:

USER   PROSPECTING  NEEDS_ANALYSIS  CLOSED_WON
---------------------------------------------
chris  10000        0               0
chris  0            15000           0
chris  0            0               10000
sara   5000         0               0
sara   0            0               10000 
我想做的是,在我只获得1个用户的情况下,折叠结果,以及每个SalesStage的用户数量

USER   PROSPECTING  NEEDS_ANALYSIS  CLOSED_WON
---------------------------------------------
chris  10000        15000           10000
sara   5000         0               10000

您需要在$amounts中添加聚合函数。。。即:

SELECT

u.user_name as USER,

if(o.sales_stage='Prospecting', SUM(o.amount), '') as PROSPECTING,

if(o.sales_stage='Needs Analysis', SUM(o.amount), '') as NEEDS_ANALYSIS,

if(o.sales_stage='Closed Won', SUM(o.amount), '') as CLOSED_WON

FROM

opportunities o,

users u

WHERE

o.assigned_user_id = u.id

GROUP BY

u.user_name
编辑


现在我考虑一下,您可能仍然会得到单独的行,因为同一用户的不同记录的销售阶段可能不同。您是否考虑过使用例程对每个销售阶段进行计算,以便将结果向下折叠到每个用户一行?

您可以将当前查询包装到另一个查询中,如下所示:

select subquery.user, 
       sum(subquery.propspecting), 
       sum(subquery.needs_analysis), 
       sum(subquery.closed_won) 
from (*...your query goes here*) subquery 
group by subquery.user
“折叠”通常被称为“旋转”,因为您正在将行转换为列数据。使用:

  SELECT u.user_name as USER,
         MAX(CASE WHEN o.sales_stage = 'Prospecting' THEN o.amount END) AS PROSPECTING,
         MAX(CASE WHEN o.sales_stage = 'Needs Analysis' THEN o.amount END) AS NEEDS_ANALYSIS,
         MAX(CASE WHEN o.sales_stage = 'Closed Won' THEN o.amount END) AS CLOSED_WON
    FROM OPPORTUNITIES o
    JOIN USERS u ON u.id = o.assigned_user_id
GROUP BY u.user_name

首先想到的是使用三个不同的别名连接Opportunities表,然后选择适当的别名。fieldname。。。。