web-dev-qa-db-ja.com

同じテーブルに複数のGROUP BYを持つMySQL SUM

MySQLの同じテーブルで異なるgroup by条件に基づいていくつかの合計結果を生成する最良の方法は何ですか?

私は悪い選択をしていると思いますが、より良い方法を理解することはできません。

注文したクライアントを追跡する注文テーブルがあると想像してください。注文の値といくつかの修飾子(タイプ)です。注文タイプの組み合わせでグループ化された特定のクライアントの注文の合計を合計したいと思います。

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$$

私の選択:

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;

何か不足していますか?

出力:

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

データ:

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

私はSQL Serverの方が好きですが、やる気を引き出すためのスタブがあります。 CASE式を使用して、特定の注文タイプによるSUM()注文を支援できます。

例えば:

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

これにより、[idclient]の注文がグループ化され、特定の注文レコードが次の条件または指定した組み合わせを満たすインスタンスがSUM([value])になります。

したがって、顧客が[type1]がApplesで[type2]がOrangesである注文の場合、[Apple/Orange Orders]のような新しい列の下で1であったSUM([value])を使用できます。

結果には、複数のフィールド/列の同じレコードの追加の組み合わせを含めることもできます。それが問題である場合は、CASEをGROUP BYに移動して、各組み合わせを結果セットの個別のレコードに分割します。

お役に立てれば!

5
Glen Swan