3 つの異なるテーブルから抽出された 3 つの結果を取得しました。
各テーブルは積です: loans
、credits
およびdiscounts
。
ローンとクレジットは次のデータを取得しました: clientid
、type
、productid
、date
& expiration
(残り日数)。取得した割引: clientid
、date
および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;