web-dev-qa-db-fra.com

MySQL somme avec plusieurs groupes par la même table

Quelle est la meilleure façon de produire plusieurs résultats de somme basés sur différents groupes par des conditions sur la même table dans MySQL?

Je crois que je fais un mauvais choix, mais je ne peux pas comprendre une meilleure façon.

Imaginez avoir une table de commande où je suive le client qui a fait la commande, sa valeur et des qualificatifs pour la commande (types). Je souhaite résumer les commandes totales d'un client donné groupé par une combinaison des types de commande:

delimiter $$

CREATE TABLE `orders` (
  `idorder` int(11) NOT NULL,
  `value` double DEFAULT NULL,
  `idclient` int(11) DEFAULT NULL,
  `type1` int(11) DEFAULT NULL,
  `type2` int(11) DEFAULT NULL,
  `type3` bit(1) DEFAULT NULL,
  PRIMARY KEY (`idorder`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$

Mon choix:

SELECT T0.idclient, T1.condition1, T2.condition2, T3.condition3 FROM
(SELECT 1 AS idclient) AS T0
LEFT JOIN
(SELECT idclient, SUM(value) condition1 FROM `test`.`orders` WHERE idclient = 1 AND type1 = 1 AND type2 = 1 AND type3 = 0) AS T1
ON T0.idclient = T1.idclient
LEFT JOIN
(SELECT idclient, SUM(value) condition2 FROM `test`.`orders` WHERE idclient = 1 AND type1 = 1 AND type2 = 1 AND type3 = 1) AS T2
ON T0.idclient = T2.idclient
LEFT JOIN
(SELECT idclient, SUM(value) condition3 FROM `test`.`orders` WHERE idclient = 1 AND type1 = 1 AND type2 = 0 AND type3 = 0) AS T3
ON T0.idclient = T3.idclient;

Est-ce que je manque quelque chose?

Production:

+----------+------------+------------+------------+
| idclient | condition1 | condition2 | condition3 |
+----------+------------+------------+------------+
|        1 |         10 |         20 |         30 |
+----------+------------+------------+------------+
1 row in set (0.00 sec)

Données:

INSERT INTO `orders` VALUES (1,5,1,1,1,'\0'),(2,5,1,1,1,'\0'),(3,20,1,1,1,''),(4,5,1,1,0,'\0'),(5,25,1,1,0,'\0');
4
Yamada

Je suis plus d'un gars SQL Server, mais voici un coup de poignard pour vous faire motiver. Vous pouvez utiliser l'expression de cas pour aider les commandes SUM () par certains types de commandes.

Par exemple:

SELECT
    idclient AS [Client ID]
   ,COUNT(value) AS [Total Orders]
   ,SUM(value) AS [Total Order Value]
   ,SUM( CASE WHEN type1 = 'some type' THEN value ELSE 0 END) AS [Order Combo 1]
   ,SUM( CASE WHEN type1 = 'some type' AND type2 = 'another type' THEN value ELSE 0 END) [Order Combo 2]
   ,SUM( CASE WHEN type1 = 'some type' AND type2 = 'another type' AND type3 = 'another type' THEN value ELSE 0 END) [Order Combo 3]
FROM 'test'.'orders'
GROUP BY idclient

Cela regroupera les commandes sur [IDCLIENT] et SUMD ([[valeur]) Les instances où certains enregistrements de commande répondent aux conditions ou combinaisons suivantes que vous avez spécifiées.

Donc, si un client a une commande où [type1] était des pommes et [type2] étaient des oranges, vous pouvez résumer ([[valeur]) qui a été 1 sous une nouvelle colonne appelée quelque chose comme [Apple/Orange Commandes].

Le résultat peut également inclure des combinaisons supplémentaires pour le même enregistrement dans plusieurs champs/colonnes. Si tel est un problème, déplacez simplement le cas au groupe pour casser chaque combinaison dans un enregistrement séparé dans le jeu de résultats.

J'espère que cela t'aides!

5
Glen Swan