Как свернуть строки MySQL в столбцы Результат - PullRequest
3 голосов
/ 29 октября 2010

Есть запрос, где я хочу получить:

  • Username пользователя, присоединенного к текущей записи возможности

  • Sales Stage, связанных с каждой записью возможности

  • Dollar сумма, связанная с записью возможности

Я хочу:

  • Возьмите текущий результат IF IFA и сложите его

Текущий запрос:

$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

Ответы [ 3 ]

4 голосов
/ 29 октября 2010

«Свертывание» обычно называется «поворотом», поскольку вы преобразуете строки в столбчатые данные. Использование:

  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
1 голос
/ 29 октября 2010

вам нужно добавить агрегирующие функции к вашим суммам в долларах ... т.е.:

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

EDIT

Теперь, когда я думаю об этом, вы, вероятно, по-прежнему получите отдельные строки, потому что этапы продаж могут отличаться для разных пользователей. Рассматривали ли вы использование подпрограммы для выполнения расчетов для каждого этапа продаж, чтобы свести результаты до одной строки на пользователя?

0 голосов
/ 29 октября 2010

Вы можете заключить текущий запрос в другой запрос, например:

select subquery.user, 
       sum(subquery.propspecting), 
       sum(subquery.needs_analysis), 
       sum(subquery.closed_won) 
from (*...your query goes here*) subquery 
group by subquery.user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...