【问题标题】:How to Collapse MySQL Rows to Columns Result如何将 MySQL 行折叠到列结果
【发布时间】:2010-10-29 17:45:41
【问题描述】:

有一个查询,我想获取:

  • Username 附加到当前机会记录的用户

  • Sales Stage 与每个机会记录关联

  • Dollar 与机会记录关联的金额

我想:

  • 获取当前的 IF STATEMENT 结果并将其折叠

当前查询:

$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 个用户的结果,以及每个销售阶段他们各自的金额

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

【问题讨论】:

  • 立即想到的是用三个不同的别名加入机会表,然后选择适当的 alias.fieldname....

标签: php mysql sql pivot


【解决方案1】:

“折叠”通常称为“透视”,因为您将行转换为列数据。使用:

  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

【讨论】:

    【解决方案2】:

    您需要将聚合函数添加到您的 $ 金额...即:

    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
    

    编辑

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

    【讨论】:

      【解决方案3】:

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

      select subquery.user, 
             sum(subquery.propspecting), 
             sum(subquery.needs_analysis), 
             sum(subquery.closed_won) 
      from (*...your query goes here*) subquery 
      group by subquery.user
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多