0

支払い要求のテーブルがあります。

PaymentId (UNSIGNED INT AI)
ClientId (USINGNED INT)
Amount (FLOAT)
PayTo (DATE)

PayTo の場合、通常、(クライアントごとに) 2 ~ 3 個の個別の値しかないため、リストを作成したいと思います - この日までに支払われるべき金額です。次のようなクエリを探していましたか?

SELECT PayTo, SUM(IF(PayTo <= PayTo, Amount, 0)) as AmountThisDate 
FROM Payments 
WHERE ClientId='%d' 
GROUP BY PayTo
ORDER BY PayTo DESC

しかし、私は100%確信しています

PayTo <= PayTo

動作しません。

GROUP BY列とTABLE列が同じ列の場合、一度にアクセスする正しい方法は何ですか?

4

2 に答える 2

1

累積合計が必要なようです。相関サブクエリを使用する方法は次のとおりです。

SELECT p1.PayDate,
       (select sum(p2.amount)
        from Payments p2
        where p2.ClientId = p.ClientId and
              p2.PayDate <= p.PayDate
       ) as AmountThisDate
FROM Payments p1
WHERE p1.ClientId='%d' 
GROUP BY p1.PayDate 
ORDER BY p1.PayDate DESC;

にインデックスを付けることで、パフォーマンスが向上しpayments(ClientId, PayDate, Amount)ます。

于 2013-07-23T13:56:39.300 に答える