0

3 つの異なるテーブルから抽出された 3 つの結果を取得しました。

各テーブルは積です: loanscreditsおよびdiscounts

ローンとクレジットは次のデータを取得しました: clientidtypeproductiddate& expiration(残り日数)。取得した割引: clientiddateおよびexpiration

結果は、製品が 10 日 (またはそれ以下) で期限切れになり、2 つの日付の間に登録されたすべてのクライアントの回数 (カウント) です。例(ローンのみ):

SELECT clientid, COUNT(*)
FROM loans
WHERE ((type LIKE 'TITULAR') AND(date BETWEEN 'ccyy-mm-dd' AND 'ccyy-mm-dd') AND (expires <= 10))
GROUP BY clientid
ORDER BY clientid;

明らかに、すべてのクライアントが同時にローン、クレジット、または割引を受けたわけではありませんが、制限日の中で 10 日以内に有効期限が切れる製品をクライアントが持っている回数を合計する結果を取得する必要があります。

したがって、たとえば、クライアント #200 が 3 つのローン、2 つのクレジット、および 1 つの割引のみを取得したとします。date1 と date2 の間のすべてで、有効期限が 10 以下です。結果は 6 になるはずです。

これまでのところ、私は試しました:

SELECT loansr.clienteid, (loansr.count + creditsr.count + discountsr.count)
FROM
    (SELECT clienteid, COUNT(*) AS "count"
    FROM loans
    WHERE (type LIKE 'TITULAR') 
    AND (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires <= 10)
    GROUP BY clienteid) loansr,
    (SELECT clienteid, COUNT(*) AS "count"
    FROM credits
    WHERE (type LIKE 'TITULAR') 
    AND (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires <= 10)
    GROUP BY clienteid) creditsr,
    (SELECT clienteid, COUNT(*) AS "count"
    FROM discounts
    WHERE (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires <= 10)
    GROUP BY clienteid) discountsr
WHERE
    (loansr.clienteid = creditsr.clienteid = discountsr.clienteid)
ORDER BY loansr.clienteid;

Edit 18:25 UNION ALL を使用して 3 つの結果を混合し、次に clienteid でグループ化すると、探しているものが得られると思いますよね?

SELECT clienteid AS "CLIENTE", SUM(COUNT) AS  "NUM_VECES_INCI_10_ACT_U3M" FROM
    ((SELECT clienteid, COUNT(*) AS "COUNT"
    FROM loans
    WHERE (titularidad_tipo LIKE 'TITULAR') 
    AND (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires >= 11)
    GROUP BY clienteid)
        UNION ALL
    (SELECT clienteid, COUNT(*) AS "COUNT"
    FROM credits
    WHERE (titularidad_tipo LIKE 'TITULAR') 
    AND (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires >= 11)
    GROUP BY clienteid)
        UNION ALL
    (SELECT clienteid, COUNT(*) AS "COUNT"
    FROM discounts
    WHERE (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires >= 11)
    GROUP BY clienteid)) orig
GROUP BY clienteid
ORDER BY clienteid;
4

1 に答える 1

1

できればコメントに投稿します:) UNION ALLを使用すると、望ましい結果が得られるはずです。ただし、テーブルloanr、credits、およびdiscountsテーブル(date、expires)には適切なインデックス(tiularidad_tipo、date、expiresをお勧めします)があることを確認してください。適切なインデックスがあれば、結果はすぐに出てきます。

于 2013-09-12T19:37:25.890 に答える