2017-09-26 1 views
1

J'ai une table MySQL qui suit certains totaux à la fois par heure du jour et par emplacement. J'essaie de créer une requête qui va totaliser non seulement chaque colonne, mais aussi chaque ligne. La requête que j'ai jusqu'ici totaux chaque colonne, mais je ne peux pas comprendre comment obtenir un total pour chaque rangée aussi bien.Création d'une requête de tableau croisé dans MySQL

C'est ma requête:

SELECT * FROM 
(SELECT IFNULL(hour,"Total") as hour, SUM(location1), SUM(location2), SUM(location3), SUM(location4), SUM(location), FROM counts WHERE ay = 'AY1617' GROUP BY hour WITH ROLLUP) as crossdata 
ORDER BY FIELD (hour,'8:00am','9:00am','10:00am','11:00am','12:00pm','1:00pm','2:00pm','3:00pm','4:00pm','5:00pm','6:00pm','7:00pm','8:00pm','9:00pm','10:00pm','11:00pm') 

C'est finalement ce que je veux la sortie pour ressembler à:

hour location1 location2 location3 location4 totals 
8am  4    3   2   1   10 
9am  1    2   2   1   6 
10am  2    3   2   3   10 
totals  7    8   6   5   26 

Comment puis-je y parvenir?

Répondre

1

Pour ce que cela vaut, ce n'est pas une requête de tableau croisé. Vous ne faites pas pivoter les lignes vers les colonnes.

J'ai essayé cette requête et a obtenu le résultat souhaité:

SELECT IFNULL(hour, 'Total') AS hour, 
    SUM(location1) AS location1, 
    SUM(location2) AS location2, 
    SUM(location3) AS location3, 
    SUM(location4) AS location4, 
    SUM(location1)+SUM(location2)+SUM(location3)+SUM(location4) AS totals 
FROM counts 
WHERE ay = 'AY1617' 
GROUP BY hour WITH ROLLUP; 

Vous devriez vraiment utiliser le type de données TIME au lieu de chaînes pour l'heure. Ensuite, il trie juste correctement.

+----------+-----------+-----------+-----------+-----------+--------+ 
| hourt | location1 | location2 | location3 | location4 | totals | 
+----------+-----------+-----------+-----------+-----------+--------+ 
| 08:00:00 |   4 |   3 |   2 |   1 |  10 | 
| 09:00:00 |   1 |   2 |   2 |   1 |  6 | 
| 10:00:00 |   2 |   3 |   2 |   3 |  10 | 
| Total |   7 |   8 |   6 |   5 |  26 | 
+----------+-----------+-----------+-----------+-----------+--------+