2009-08-28 6 views
2

J'ai un résultat suivant de requête:Comment SUM de MySQL pour chaque enregistrement n

+---------------+------+------+------+------+------+------+------+-------+ 
| order_main_id | S36 | S37 | S38 | S39 | S40 | S41 | S42 | total | 
+---------------+------+------+------+------+------+------+------+-------+ 
|   26 | 127 | 247 | 335 | 333 | 223 | 111 | 18 | 1394 | 
|   26 | 323 | 606 | 772 | 765 | 573 | 312 | 154 | 3505 | 
|   38 | 25 | 35 | 35 | 35 | 20 | NULL | NULL | 150 | 
|   38 | 25 | 35 | 35 | 35 | 20 | NULL | NULL | 150 | 
|   39 | 65 | 86 | 86 | 42 | 21 | NULL | NULL | 300 | 
|   39 | 42 | 58 | 58 | 28 | 14 | NULL | NULL | 200 | 
|   35 | 11 | 20 | 21 | 18 | 9 | 2 | NULL | 81 | 
|   35 | 10 | 25 | 30 | 23 | 12 | 1 | NULL | 101 | 
+---------------+------+------+------+------+------+------+------+-------+ 

Je voudrais insérer un SUM avant entrer dans différents order_main_id, ce serait ce résultat:

+---------------+------+------+------+------+------+------+------+-------+ 
| order_main_id | S36 | S37 | S38 | S39 | S40 | S41 | S42 | total | 
+---------------+------+------+------+------+------+------+------+-------+ 
|   26 | 127 | 247 | 335 | 333 | 223 | 111 | 18 | 1394 | 
|   26 | 323 | 606 | 772 | 765 | 573 | 312 | 154 | 3505 | 
|    | 450 | 853 | 1107 | 1098 | 796 | 423 | 172 | 4899 | 
|   38 | 25 | 35 | 35 | 35 | 20 | NULL | NULL | 150 | 
|   38 | 25 | 35 | 35 | 35 | 20 | NULL | NULL | 150 | 
|    | 50 | 70 | 70 | 70 | 40 | NULL | NULL | 300 | 
|   39 | 65 | 86 | 86 | 42 | 21 | NULL | NULL | 300 | 
|   39 | 42 | 58 | 58 | 28 | 14 | NULL | NULL | 200 | 
|    | 107 | 144 | 144 | 70 | 35 | NULL | NULL | 500 | 
|   35 | 11 | 20 | 21 | 18 | 9 | 2 | NULL | 81 | 
|   35 | 10 | 25 | 30 | 23 | 12 | 1 | NULL | 101 | 
|    | 21 | 45 | 51 | 41 | 21 | 3 | NULL | 182 | 
+---------------+------+------+------+------+------+------+------+-------+ 

Comment rendre cela possible?

+0

Le deuxième résultat ne vient pas d'une requête, mais je insérez-le manuellement à la main – Stephen

+0

@OP: Pour les vrais? Mec, je suis tellement désolé! – Eric

Répondre

4

Vous aurez besoin d'écrire une deuxième requête qui utilise GROUP BY order_main_id.

Quelque chose comme:

SELECT sum(S41+...) FROM yourTable GROUP BY orderMainId 

K

+0

Oui, j'ai fait une seconde requête comme celle que vous suggérez, c'est pourquoi j'ai obtenu cette valeur. Mais je voudrais le faire par une requête. Toute pensée ? – Stephen

+2

Non, à ma connaissance, ce n'est pas possible avec une requête. Vous pouvez réaliser ceci en écrivant une procédure stockée qui remplit une table temporaire avec les résultats de vos deux requêtes afin d'obtenir votre sortie désirée. – KB22

+0

Merci KB22, Ceci est une lumière pour moi, que ce n'est pas possible. – Stephen

2

Vous pouvez réellement faire dans une requête, mais avec un union all (vraiment deux requêtes, mais les jeux de résultats sont combinés pour faire un jeu de résultats impressionnant) :

select 
    order_main_id, 
    S36, 
    S37, 
    S38, 
    S39, 
    S40, 
    S41, 
    S42, 
    S36 + S37 + S38 + S39 + S40 + S41 + S42 as total, 
    'Detail' as rowtype 
from 
    tblA 
union all 
select 
    order_main_id, 
    sum(S36), 
    sum(S37), 
    sum(S38), 
    sum(S39), 
    sum(S40), 
    sum(S41), 
    sum(S42), 
    sum(S36 + S37 + S38 + S39 + S40 + S41 + S42), 
    'Summary' as rowtype 
from 
    tblA 
group by 
    order_main_id 
order by 
    order_main_id, RowType 

Rappelez-vous que la order by affecte l'ensemble du union all, pas seulement la dernière requête. Ainsi, votre resultset ressemblerait à ceci:

+---------------+------+------+------+------+------+------+------+-------+---------+ 
| order_main_id | S36 | S37 | S38 | S39 | S40 | S41 | S42 | total | rowtype | 
+---------------+------+------+------+------+------+------+------+-------+---------+ 
|   26 | 127 | 247 | 335 | 333 | 223 | 111 | 18 | 1394 | Detail | 
|   26 | 323 | 606 | 772 | 765 | 573 | 312 | 154 | 3505 | Detail | 
|   26 | 450 | 853 | 1107 | 1098 | 796 | 423 | 172 | 4899 | Summary | 
|   35 | 11 | 20 | 21 | 18 | 9 | 2 | NULL | 81 | Detail | 
|   35 | 10 | 25 | 30 | 23 | 12 | 1 | NULL | 101 | Detail | 
|   35 | 21 | 45 | 51 | 41 | 21 | 3 | NULL | 182 | Summary | 
|   38 | 25 | 35 | 35 | 35 | 20 | NULL | NULL | 150 | Detail | 
|   38 | 25 | 35 | 35 | 35 | 20 | NULL | NULL | 150 | Detail | 
|   38 | 50 | 70 | 70 | 70 | 40 | NULL | NULL | 300 | Summary | 
|   39 | 65 | 86 | 86 | 42 | 21 | NULL | NULL | 300 | Detail | 
|   39 | 42 | 58 | 58 | 28 | 14 | NULL | NULL | 200 | Detail | 
|   39 | 107 | 144 | 144 | 70 | 35 | NULL | NULL | 500 | Summary | 
+---------------+------+------+------+------+------+------+------+-------+---------+ 

De cette façon, vous savez ce qui est et ce qui est pas un détail ou une ligne résumé, et order_main_id que ce soit pour. Vous pouvez toujours (et probablement devriez) cacher cette colonne dans votre couche de présentation.

+0

+1 À droite, ou laissez votre outil de reporting gérer cela – Andomar

+0

Cela fonctionne vraiment. Comme S36 jusqu'à S42 sont des alias d'une autre SOMME avant UNION ALL, ces alias ne sont pas reconnus après UNION ALL, donc j'ai besoin de faire un alias à nouveau, Le rowType est une addition de génie. Merci beaucoup Eric. – Stephen

0

Pour des choses comme celles-ci, je pense que vous devriez utiliser une bibliothèque de rapports (tels que Crystal Reports), il va vous faire économiser beaucoup d'ennuis, vérifiez JasperReports and similar projects on osalt

Questions connexes