2013-03-01 3 views
1

Salut Col. j'ai une table qui stocke des évaluations et des évaluations (entre 1 et 5)Groupe par mois et ajouter plusieurs

Je ne sais pas même si cela peut être fait avec SQL ou non. Voulez-vous que je fasse est de groupe par mois et ajouter tous les Q1, Q2, Q3 et Q4 dans une colonne. Les ont le nombre d'enregistrements dans ce mois groupés dans une autre colonne.

Ensuite, je pourrais utiliser PHP pour calculer un taux moyen dans ces mois.

unixStamp  | Q1 | Q2 | Q3 | Q4 
----------------------------------------------------- 
    1362149504  | 5 | 4 | 3 | 5 
    1362136774  | 5 | 5 | 2 | 5 
    ..........  | ... | .... | .... | .... 

C'est ce que je veux que l'on atteigne.

Mnth   | score | count | 
--------------------------------------- 
    1    | 192 | 20 | 
    2    | 365 | 40 | 
    ..........  | ... | .... | 
+0

Je pense que vous devriez prendre le unixStamp et chercher le mois de cela. 'score' est quelque chose d'inconnu :-D et' count' est Q1 + ... + Q4 –

Répondre

1

Le GROUP BY peut contenir une expression arbitraire (ou l'alias à partir d'une expression SELECT), et on peut SUM() les 4 colonnes trimestrielles ensemble comme un agrégat.

SELECT 
    /* Retrieve only the month from unixStamp */ 
    MONTH(FROM_UNIXTIME(unixStamp)) AS Mnth, 
    /* SUM() as an aggregate the 4 quarterly cols */ 
    SUM(Q1+Q2+Q3+Q4) AS score, 
    /* COUNT(*) aggregate will list number of records for group */ 
    COUNT(*) AS `count` 
FROM yourtable 
GROUP BY Mnth 

Notez que le groupe sera avant le mois ne, pas la combinaison de mois/année qui semble plus approprié. Si vous avez besoin que, utilisez quelque chose comme

/* Supplies month like 2013-02 */ 
SELECT 
    DATE_FORMAT(FROM_UNIXTIME(unixtimestamp), '%Y-%m') AS Mnth, 
    ... 
+0

Ça fait ce que je voulais. Merci beaucoup. –

+0

@DavidAllen Heureux de vous aider. –

+0

Je sais que cela est hors de question pouvez-vous remplacer SUM (temps de réponse + amabilité + quality_service + value_money) AS marquer quelque chose comme COUNTIF (temps de réponse + amabilité + quality_service + value_money> 15) AS score - pour donner le nombre d'évaluations sur 15 –

2

Vous pouvez utiliser un CROSS JOIN à UNPIVOT les données pour obtenir le résultat:

SELECT Mnth, 
    sum(data) score, 
    count(data) `count` 
FROM 
(
    SELECT MONTH(FROM_UNIXTIME(unixStamp)) Mnth, 
    CASE q.col 
     WHEN 'Q1' THEN Q1 
     WHEN 'Q2' THEN Q2 
     WHEN 'Q3' THEN Q3 
     WHEN 'Q4' THEN Q4 
    END AS DATA 
    FROM yourtable t 
    CROSS JOIN 
    (
    SELECT 'Q1' AS col 
    UNION ALL SELECT 'Q2' 
    UNION ALL SELECT 'Q3' 
    UNION ALL SELECT 'Q4' 
) q 
) s 
group by Mnth 

Voir SQL Fiddle with Demo

+0

Pivotant Stack Overflow dans un avenir meilleur. – Zane