0

データを選択して要約する必要がある 3 つのテーブルがあります。

Table: IDEA  
REFERENCE SL   
128       SL1  
200       SL1  
201       SL2  
205       SL3 



Table: ACCT1  
IDEA_REF  ACCTS  
128       5  
128       2  
200       3  
205       4  

Table: ACCT2  
IDEA_REF  ACCTS  
201       3  
205       4 
205       3

私がする必要があるのは、両方のテーブルの ACCTS フィールドからの合計で SL でソートされた要約を引き出すことです。

これまでに使用したSQLは次のとおりです。

SELECT I.SL AS SL, COUNT(DISTINCT I.REFERENCE) AS NO,  
    SUM(CASE WHEN A1.IDEA_REF=I.REFERENCE THEN A1.ACCTS ELSE 0 END) AS ACCT1,  
    SUM(CASE WHEN A2.IDEA_REF=I.REFERENCE THEN A2.ACCTS ELSE 0 END) AS ACCT2  
    FROM IDEA I  
    LEFT JOIN ACCT1 A1 ON A1.IDEA_REF=I.REFERENCE  
    LEFT JOIN ACCT2 A2 ON A2.IDEA_REF=I.REFERENCE  
    WHERE A2.IDEA_REF IN I.REFERENCE OR A1.IDEA_REF IN I.REFERENCE  
    GROUP BY I.SL  

私が見つけている問題は、IDEA テーブルを参照して、ACCT1 および ACCT2 テーブルに複数の値がある場合です。このクエリの結果は次のとおりです。

SL  NO  ACCT1  ACCT2  
SL1 2   10      0  
SL2 1    0      3  
SL3 1    8      7  

SL3 行は、ACCT1 と ACCT2 の値を 2 回追加します。それらを適切な回数追加する正しい方法が見つからないようです。

望ましい出力は次のとおりです。

SL   NO   ACCT1  ACCT2
SL1  2    10     0  
SL2  1     0     3  
SL3  1     4     7

どんな助けでも大歓迎です。

4

3 に答える 3

0

サブクエリが count distinct よりも優れているとは思いません。また、同じテーブルで複数の結合を避ける必要があります

SELECT
     i.SL,
     COUNT(DISTINCT i.SL) NO,
     COALESCE(SUM(a.sum1), 0) act1,
     COALESCE(SUM(b.sum2), 0) act2
FROM
     IDEA i
LEFT JOIN
     (
     SELECT
         IDEA_REF,
         SUM(ACCTS) sum1
     FROM
         ACCT1
     GROUP BY IDEA_REF
     ) a
     ON i.REFERENCE = a.IDEA_REF
LEFT JOIN
     (
     SELECT
         IDEA_REF,
         SUM(ACCTS) sum2
     FROM
         ACCT2
     GROUP BY IDEA_REF
     ) b
     ON i.REFERENCE = b.IDEA_REF
GROUP BY i.SL

SQL フィドル

結果は同じですが、テーブル スキャンが少なくなります

于 2014-10-31T20:16:20.080 に答える
0

UNION ALL を使用して結果を得ることができます

SELECT 
    COMB.SL AS SL, 
    COUNT(DISTINCT COMB.REFERENCE) AS NO, 
    sum(T1) as ACCT1, 
    sum(T2) ACCT2
FROM (
    SELECT 
        I.*,A1.ACCTS as t1,0 as t2
    FROM 
        IDEA I  
    LEFT JOIN 
        ACCT1 A1 ON A1.IDEA_REF=I.REFERENCE  
    UNION ALL
    SELECT 
        I.*,0 as t1,A2.ACCTS as t2
    FROM 
        IDEA I  
    LEFT JOIN 
        ACCT2 A2 ON A2.IDEA_REF=I.REFERENCE
) as COMB
GROUP BY 
    COMB.SL
于 2014-10-31T20:52:21.673 に答える