2013-07-23 51 views
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列的正確方法是什麼?

+3

你能提供樣本數據和預期結果嗎? –

+1

字段名稱是PayTo還是PayDate? – Gadonski

+0

'PayDate <= PayDate'永遠是EQUAL – jaczes

回答

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)索引得到改善。

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

這是您要尋找的?