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

合計の問題によるMySQLの結合テーブルグループ

    DテーブルとEテーブルの両方をフラット化する必要があります。次に、AとBはCの単なるルックアップであると想定しているため、AでGROUPBYを実行する必要はありません。 http://www.sqlfiddle.com/#!2/fccf1/8

    AとBがCの情報の要約にどのように関連しているかが(まだ)わからないため、ノイズ(AとB)を削除しました

    これを試してください:

    SELECT
           C.Article,
           C.Text,
    
           COALESCE(D.ClicksSum,0) AS ClicksSum,
           COALESCE(D.ImpressionsSum,0) AS ImpressionsSum,
    
           COALESCE(E.ViewsSum,0) AS ViewsSum,
           COALESCE(E.VisitorsSum,0) AS VisitorsSum
    FROM 
           C
    
           LEFT JOIN 
           (
             SELECT TableC, SUM(Clicks) AS ClicksSum, SUM(Impressions) AS ImpressionsSum
             FROM D
             GROUP BY TableC
           ) D ON C.ID=D.TableC
    
           LEFT JOIN 
           (
             SELECT TableC, SUM(Views) AS ViewsSum, SUM(Visitors) AS VisitorsSum
             FROM E
             GROUP BY TableC       
           ) E ON C.ID=E.TableC
    

    出力:

    |    ARTICLE |        TEXT | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
    ----------------------------------------------------------------------------------
    |       Type | Unicode Art |        23 |              8 |       23 |           8 |
    |     Header | Spreadsheet |        15 |             10 |       32 |          21 |
    | Auto Align |         Off |         0 |              0 |        0 |           0 |
    

    sqlfiddleの投稿にこれらのスキーマを手動で入力しなかったことに注意してください。sqlfiddleのTextto DDLを使用しています。

    http://sqlfiddle.com が大好きです 、そのテキストからDDLへ ASCIIアートツ

    からデータを解析することもできます

    (コメントから)より明確な目的を見ると、これは次のようになります: http:/ /www.sqlfiddle.com/#!2/fccf1/13

    SELECT
           A.Name, A.Description,
    
           COALESCE(SUM(D.ClicksSum),0) AS ClicksSum,
           COALESCE(SUM(D.ImpressionsSum),0) AS ImpressionsSum,
    
           COALESCE(SUM(E.ViewsSum),0) AS ViewsSum,
           COALESCE(SUM(E.VisitorsSum),0) AS VisitorsSum
    FROM 
           C
    
           LEFT JOIN 
           (
             SELECT TableC, SUM(Clicks) AS ClicksSum, SUM(Impressions) AS ImpressionsSum
             FROM D
             GROUP BY TableC
           ) D ON C.ID=D.TableC
    
           LEFT JOIN 
           (
             SELECT TableC, SUM(Views) AS ViewsSum, SUM(Visitors) AS VisitorsSum
             FROM E
             GROUP BY TableC       
           ) E ON C.ID=E.TableC
    
           RIGHT JOIN B ON B.ID = C.TableB
           RIGHT JOIN A ON A.ID = B.TableA
    
    GROUP BY A.ID
    

    出力:

    |       NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
    ----------------------------------------------------------------------------------
    |       Type | Unicode Art |        38 |             18 |       55 |          29 |
    |     Header | Spreadsheet |         0 |              0 |        0 |           0 |
    | Auto Align |         Off |         0 |              0 |        0 |           0 |
    

    上記のアプローチでもデカルト積が生成される可能性があります。SubCategory(B)をフラット化してからCategory(A)にグループ化します。 http://www.sqlfiddle.com/#!2/fccf1/19

    SELECT 
      A.Name, A.Description,
      COALESCE(SUM(B.ClicksSum),0) AS ClicksSum,
      COALESCE(SUM(B.ImpressionsSum),0) AS ImpressionsSum,
      COALESCE(SUM(B.ViewsSum),0) AS ViewsSum,
      COALESCE(SUM(B.VisitorsSum),0) AS VisitorsSum
    FROM A
    LEFT JOIN
    (
    
      SELECT 
        B.ID, B.TableA,
        SUM(C.ClicksSum) AS ClicksSum,
        SUM(C.ImpressionsSum) AS ImpressionsSum,
        SUM(C.ViewsSum) AS ViewsSum,
        SUM(C.VisitorsSum) AS VisitorsSum
      FROM B
      LEFT JOIN
      (
    
        SELECT
          C.TableB,
    
          D.ClicksSum,
          D.ImpressionsSum,
    
          E.ViewsSum,
          E.VisitorsSum
        FROM 
        C
    
        LEFT JOIN 
        (
          SELECT TableC, SUM(Clicks) AS ClicksSum, SUM(Impressions) AS ImpressionsSum
          FROM D
          GROUP BY TableC
        ) D ON C.ID=D.TableC
    
        LEFT JOIN 
        (
          SELECT TableC, SUM(Views) AS ViewsSum, SUM(Visitors) AS VisitorsSum
          FROM E
          GROUP BY TableC       
        ) E ON C.ID=E.TableC
    
      ) C ON C.TableB = B.ID
      GROUP BY B.ID
    
    ) B ON B.TableA = A.ID
    GROUP BY A.ID
    

    出力:

    |       NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
    ----------------------------------------------------------------------------------
    |       Type | Unicode Art |        38 |             18 |       55 |          29 |
    |     Header | Spreadsheet |         0 |              0 |        0 |           0 |
    | Auto Align |         Off |         0 |              0 |        0 |           0 |
    


    1. Mysql select*fromはすべての行を返さない

    2. DjangoにUnicode文字列を保存するときにMySQLの誤った文字列値エラー

    3. MySQLデータベースからの定期的なイベントを含むPHPカレンダー

    4. WHERE句を使用して1つのSQLクエリ内の配列の値をチェックする