3

この質問のタイトルは、実際には私が望むものを反映していない可能性があります。これ以上良いものは思いつきませんでした。たぶん、 「この方法で取得した2つのテーブルを結合する」を最後に追加する必要がありました。

このテーブルがあるとしましょう。シナリオは、 idloan_idでローンを支払い、その支払いをテーブル「Payment」に保存し、各支払いには独自の がありidます。お客様が代金を支払うと、 に変わりpaidます1

+---------+----+--------+------+
| loan_id | id | amount | paid |
+---------+----+--------+------+
|       1 |  1 |   1000 |    1 |
|       1 |  2 |   1000 |    1 |
|       1 |  3 |   1000 |    0 |
|       2 |  4 |  10000 |    0 |
|       3 |  5 |  20000 |    1 |
+---------+----+--------+------+

そして今、ローンに関するレポートが必要です。出力は次のようになります。

+---------+-------+-----------+
| loan_id |  paid | remaining |
+---------+-------+-----------+
|       1 |  2000 |      1000 |
|       2 |     0 |     10000 |
|       3 | 20000 |         0 |
+---------+-------+-----------+

paid列は基本的にamount、pay = 1 のすべてのフィールドの合計です。そして、pay = 0 の行のremaining合計です。これらは でグループ化する必要があります。amountloan_id

私が試したこと:

さまざまな結合、製品などを試しましたが、クエリから得られる最良のものは次のとおりです。

SELECT loan_id, SUM(paid), SUM(remaining)
FROM (
    SELECT loan_id, 0 AS paid, SUM(amount) AS remaining
    FROM Payment
    WHERE paid = 0
    GROUP BY loan_id

    UNION

    SELECT loan_id, SUM(amount) AS paid, 0 AS remaining
    FROM Payment
    WHERE paid = 1
    GROUP BY loan_id
)
GROUP BY loan_id

しかし、私よりも良い方法があるはずです。

4

2 に答える 2

4
SELECT 
loan_id, 
SUM(case when paid = 1 then amount else 0 end) as payed, 
SUM(case when paid = 0 then amount else 0 end) as remaining
FROM Payment
GROUP BY loan_id

コードをわかりやすくするために、列名をエイリアスとして使用することは避けます (有料 => 有料)。

于 2012-09-14T08:56:16.927 に答える
2

これはどう:

SELECT Loan_ID,
SUM(Amount*Paid) Paid,
SUM(Amount*(1-Paid)) Remaining
FROM Payment
GROUP BY Loan_ID
于 2012-09-14T09:36:01.860 に答える