2012-07-19 2 views
1

Bonjour, j'essaie sans succès de créer un rapport en utilisant mysql/php, je voudrais avoir des lignes comme des colonnes similaires à Access Crosstab ou Excel Pivot. J'ai des ventes mensuelles de sales sales & que je veux diffuser dans la page avec des mois comme en-têtes de colonne.Msql Crosstab mois lignes en tant que colonnes?

Ma requête sorties au-dessous des données, mais chaque vendeur a une ligne pour chaque mois qui doesnt lu très bien,

 Jan | Feb | Mar | April 

Ventes1
Ventes2
Ventes3
Sales4

Select 
    tblcontacts.ContactFullName, 
    Count(tblcases.CaseID) As cases, 
    MonthName(tblcases.CaseDate) As Monthly 
From 
    tblcases Inner Join 
    tblcontacts On tblcases.ContactAssignedTo = 
    tblcontacts.ContactID 
Group By 
    tblcontacts.ContactFullName, 
    MonthName(tblcases.CaseDate) 
    with rollup 

Ant Des conseils ou des conseils appréciés, j'ai fait des recherches mais la plupart d'entre elles sont passées au dessus de ma tête!

Amitiés

Répondre

1

Qu'est-ce que vous pouvez faire est tout simplement un groupe par chaque contact et utiliser l'agrégation conditionnelle à compter les lignes en fonction de chaque mois:

SELECT 
    a.ContactFullName, 
    SUM(MONTH(b.CaseDate) = 1) AS Jan, 
    SUM(MONTH(b.CaseDate) = 2) AS Feb, 
    SUM(MONTH(b.CaseDate) = 3) AS Mar, 
    SUM(MONTH(b.CaseDate) = 4) AS Apr, 
    SUM(MONTH(b.CaseDate) = 5) AS May, 
    SUM(MONTH(b.CaseDate) = 6) AS Jun, 
    SUM(MONTH(b.CaseDate) = 7) AS Jul, 
    SUM(MONTH(b.CaseDate) = 8) AS Aug, 
    SUM(MONTH(b.CaseDate) = 9) AS Sep, 
    SUM(MONTH(b.CaseDate) = 10) AS Oct, 
    SUM(MONTH(b.CaseDate) = 11) AS Nov, 
    SUM(MONTH(b.CaseDate) = 12) AS Dec 
FROM 
    tblcontacts a 
INNER JOIN 
    tblcases b ON a.ContactID = b.ContactAssignedTo 
GROUP BY 
    a.ContactFullName 

Edit: Selon vos commentaires à cette réponse: pour obtenir une somme de prix de chaque mois, vous pouvez faire quelque chose comme:

SELECT 
    a.ContactFullName, 
    SUM(IF(MONTH(b.CaseDate) = 1, b.price, 0)) AS Jan, 
    SUM(IF(MONTH(b.CaseDate) = 2, b.price, 0)) AS Feb, 
    SUM(IF(MONTH(b.CaseDate) = 3, b.price, 0)) AS Mar, 
    SUM(IF(MONTH(b.CaseDate) = 4, b.price, 0)) AS Apr, 
    SUM(IF(MONTH(b.CaseDate) = 5, b.price, 0)) AS May, 
    SUM(IF(MONTH(b.CaseDate) = 6, b.price, 0)) AS Jun, 
    SUM(IF(MONTH(b.CaseDate) = 7, b.price, 0)) AS Jul, 
    SUM(IF(MONTH(b.CaseDate) = 8, b.price, 0)) AS Aug, 
    SUM(IF(MONTH(b.CaseDate) = 9, b.price, 0)) AS Sep, 
    SUM(IF(MONTH(b.CaseDate) = 10, b.price, 0)) AS Oct, 
    SUM(IF(MONTH(b.CaseDate) = 11, b.price, 0)) AS Nov, 
    SUM(IF(MONTH(b.CaseDate) = 12, b.price, 0)) AS Dec 
FROM 
    tblcontacts a 
INNER JOIN 
    tblcases b ON a.ContactID = b.ContactAssignedTo 
GROUP BY 
    a.ContactFullName 

Fondamentalement, pour chaque ligne, si le casedate est dans un mois particulier, passez la valeur de la colonne price à l'agrégation SUM, sinon, passez le 0.

+0

Salut, les deux réponses fantastiques et très utile, merci beaucoup c'est exactement ce dont j'avais besoin. J'ai essayé de voir si cela fonctionnerait aussi en utilisant une colonne de valeur de devise, ce que je ferais normalement est juste d'ajouter la colonne de devise et la somme plutôt que le caséide. J'ai une colonne 'price' qui contient des valeurs additionnées pour le salesstaff par mois mais je ne vois pas comment vous êtes en train de calculer dans votre code? Cherchez-vous combien de fois le ContactFullName apparaît chaque mois? Si oui, je suppose que je ne serais pas en mesure de comparer le prix de chaque mois de la même manière? – gary

+1

@gary, chaque 'SUM' ne fait que sommer le résultat des expressions booléennes (0 ou 1), c'est donc simplement un compte. Si vous voulez une somme de prix pour chaque mois, voir ma dernière édition. –

+0

beaucoup de mercis pour votre excellente explication et exemple de code, m'a mis sur la route d'apprendre un peu plus à ce sujet, m'a vraiment sauvé beaucoup de temps. Cordialement – gary

1
Select 
    tblcontacts.ContactFullName, 
    sum(case when MonthName(tblcases.CaseDate)='January' then 1 else 0 end) as January, 
    sum(case when MonthName(tblcases.CaseDate)='February' then 1 else 0 end) as February, 
    . 
    . 
    sum(case when MonthName(tblcases.CaseDate)='December' then 1 else 0 end) as December, 
From 
    tblcases Inner Join 
    tblcontacts On tblcases.ContactAssignedTo = 
    tblcontacts.ContactID 
    Group By 
    tblcontacts.ContactFullName 
Questions connexes