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。。。。