2010-10-29 3 views
3

Il y a une requête où je veux obtenir le:Comment Réduire les lignes MySQL à colonnes Résultat

  • Username de l'utilisateur joint au dossier d'opportunité actuelle

  • Sales Stage associée à chaque enregistrement d'opportunité

  • Dollar montant associé à l'enregistrement d'opportunité

Je veux:

  • Prenez le courant si le résultat de déclaration et le réduire

Requête en cours:

$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 "; 

Résultat actuel:

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 

Ce que je voudrais faire est de s'effondrer les résultats où je reçois seulement 1 utilisateur, et leurs montants respectifs par SalesStage

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

La chose immédiate qui vient à l'esprit se joint à la table avec trois opportunites alias différents, puis en sélectionnant le alias.fieldname approprié .... – brumScouse

Répondre

1

vous devez ajouter des fonctions de groupement à vos montants $ ... à savoir:

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

maintenant que je pense, vous aurez probablement encore des lignes séparées parce que les étapes de vente peuvent varier selon les enregistrements pour le même utilisateur. Avez-vous envisagé d'utiliser une routine pour effectuer les calculs pour chaque étape de vente afin de réduire vos résultats à une ligne par utilisateur?

0

Vous pouvez envelopper la requête en cours dans une autre requête, comme ceci:

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

inutile - cela peut être fait en une seule requête. –

4

Le « effondrement » est généralement appelé « pivotant », parce que vous convertissez en ligne des données en colonnes. Utilisation:

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 
Questions connexes