sql >> データベース >  >> RDS >> Mysql

内部結合を使用してmysqlクエリSUM()の結果を組み合わせる

    最初に合計を作成し、次に参加します。このように:

    SELECT i.uid
          ,i.date
          ,i.v_in
          ,COALESCE(o.v_out, 0) AS v_out
          ,(i.v_in - COALESCE(o.v_out, 0)) AS balance
    FROM (
        SELECT date
              ,uid
              ,SUM(value_in) AS v_in
        FROM   table1
        GROUP  BY 1,2
        ) i
    LEFT JOIN (
        SELECT date
              ,uid
              ,SUM(value_out) AS v_out
        FROM   table2
        GROUP  BY 1,2
        ) o USING (date, uid)
    

    あなたがそれを持っていた方法、すべてのvalue_in 一致するすべてのvalue_outと組み合わされます 、それによって数を掛けます。最初に集約してから、1つに参加する必要があります 1つとの合計 アウトサムとすべてがグルーヴィーです。それともそうですか?

    value_inがない場合はどうなりますか またはvalue_out 特定の(date, uid)に対して ?または、value_inのみ または、value_out ?クエリは失敗します。

    LEFT JOINを使用して改善しました [INNER] JOINの代わりに 、しかしあなたが本当に欲しいのはFULL OUTER JOIN --MySQLに欠けている機能の1つ。

    別のテーブルで日のリストを提供するか、LEFT JOIN 両方のテーブルを使用するか、不足している機能を2回LEFT JOINで回避できます。 およびUNIONこちらをご覧ください例

    または value_outを増やすことができます -1による UNIONは両方のテーブルを一緒にして、1つの合計を作成します。

    しかし、あなたはまだ value_inがないと1日の行は取得されません またはvalue_out 、これはあなたの説明に違反します。

    したがって、唯一のクリーンなソリューション すべての(date, uid)を含むテーブルを作成することです 結果とLEFT JOINに必要なもの table1の合計 およびtable2 それに、またはUNION ALL 3つ(負のtable2 )副選択してから合計します。



    1. 2つの日付の間の月

    2. MySQL 5.6.10テーブルがすでに存在するため、InnoDBはテーブルを作成できません

    3. mysql TIME_WAIT;接続の問題が多すぎます

    4. T-SQL:最も近い15分間隔に丸めます