Maison > Questions et réponses > le corps du texte
J'ai le tableau suivant :
id | Code | Montant | Quantité |
---|---|---|---|
1 | 1 | 25 | 36 |
2 | 2 | 30 | 6 |
3 | 5 | 100 | 1 |
4 | 1 | 25 | 100 |
5 | 1 | 20 | 1 |
6 | 4 | 10 | 136 |
7 | 1 | 10 | 20 |
Je veux trouver la somme de tous les montants pour lesquels code = 1 et j'ai également besoin de valeurs séparées par des virgules de toutes les quantités et de valeurs séparées par des virgules de tous les identifiants pour tous ces événements.
Par exemple : Le résultat devrait ressembler à ceci :
Code | Montant | Quantité | id |
---|---|---|---|
1 | 80 | 36, 100,1, 20 | 1,4,5,7 |
Je sais que je peux faire quelque chose de similaire
SELECT code ,SUM(amount) FROM table1 where code = 1 group by code;
pour avoir obtenu la somme correspondant à ce code mais je ne sais pas comment obtenir toutes ces quantités et identifiants.
DBFiddle
P粉5783439942024-04-02 00:22:58
Dans MySQL, vous pouvez utiliser GROUP_CONCAT
Requête n°1
select code, sum(amount) as total_amount, GROUP_CONCAT(id) as ids, GROUP_CONCAT(qty) qts from yourTable where code = 1 GROUP BY code;
Code | montant_total | id | qts |
---|---|---|---|
1 | 80 | 1,4,5,7 | 36 100,1,20 |
Dans Postgres, vous pouvez utiliser string_agg
Requête n°1
select code, sum(amount) as total_amount, string_agg(id::text,',') as ids, string_agg(qty::text , ',') qts from yourTable where code = 1 GROUP BY code;
P粉3233748782024-04-02 00:12:44
Vous pouvez simplement utiliser GROUP_CONCAT
pour regrouper toutes vos données :
SELECT t.`code`, SUM(amount) , GROUP_CONCAT(t.`qty` SEPARATOR ',') AS qtys, GROUP_CONCAT(t.`id` SEPARATOR ',') AS ids FROM yourTable t WHERE t.`code` = 1 GROUP BY t.`code` ;
GROUP_CONCAT
Par défaut, la virgule (,) est utilisée comme délimiteur afin que vous puissiez écrire la même requête :
SELECT t.`code`, SUM(amount) , GROUP_CONCAT(t.`qty`) AS qtys, GROUP_CONCAT(t.`id`) AS ids FROM yourTable t WHERE t.`code` = 1 GROUP BY t.`code` ;
Si vous souhaitez un autre délimiteur, vous pouvez également le définir spécifiquement.