Как выбрать все записи, где сумма суммы равна значению и сгруппирована по определенному столбцу (отправитель или получатель)?

Исходная таблица:

REFERENCE | DATETIME          | AMOUNT  |   SENDER |RECIPIENT   
--------------------------------------------------------------
AAB841    |2016-05-11 14:00:01|200.0000 | SENDER1  |RECIPIENT1
AAB842    |2016-05-11 14:28:05|300.0000 | SENDER2  |RECIPIENT1
AAB868    |2016-05-13 08:15:59|1700.0000| SENDER3  |RECIPIENT1
AAB883    |2016-05-17 13:07:14|1200.0000| SENDER1  |RECIPIENT2
AAB891    |2016-05-30 12:59:16|1200.0000| SENDER2  |RECIPIENT2
AAB892    |2016-05-30 13:10:32|1200.0000| SENDER3  |RECIPIENT2
AAB893    |2016-06-02 10:32:44|1000.0000| SENDER1  |RECIPIENT3
AAB894    |2016-06-02 15:24:58|100.0000 | SENDER2  |RECIPIENT3
AAB895    |2016-06-02 15:33:09|100.0000 | SENDER3  |RECIPIENT3

Ожидаемый результат: если отправитель отправляет более 2000, выберите Запись

REFERENCE | DATETIME          | AMOUNT  |  SENDER |RECIPIENT  
------------------------------------------------------------- 
AAB841    |2016-05-11 14:00:01|200.0000 | SENDER1 |RECIPIENT1
AAB883    |2016-05-17 13:07:14|1200.0000| SENDER1 |RECIPIENT2
AAB893    |2016-06-02 10:32:44|1000.0000| SENDER1 |RECIPIENT3
AAB868    |2016-05-13 08:15:59|1700.0000| SENDER3 |RECIPIENT1
AAB892    |2016-05-30 13:10:32|1200.0000| SENDER3 |RECIPIENT2
AAB895    |2016-06-02 15:33:09|100.0000 | SENDER3 |RECIPIENT3 

Ожидаемый результат:

Если отправитель отправляет меньше 2000, выберите Запись

REFERENCE | DATETIME          | AMOUNT  |  SENDER |RECIPIENT  
-------------------------------------------------------------   
AAB842    |2016-05-11 14:28:05|300.0000 | SENDER2 |RECIPIENT1
AAB891    |2016-05-30 12:59:16|1200.0000| SENDER2 |RECIPIENT2
AAB894    |2016-06-02 15:24:58|100.0000 | SENDER2 |RECIPIENT3

Мой первоначальный запрос:

select TBL1.REFERENCE, DATE(TBL1.DATETIME), TBL1.AMOUNT, TBL1.DATETIME, TBL1.SENDER, TBL1.RECIPIENT
from SOURCETABLE AS TBL1 
WHERE  (TBL1.DATETIME >= '2015-05-01 00:00:00' and TBL1.DATETIME <= '2016-07-25 23:59:59' )
GROUP BY DATE(TBL1.DATETIME), TBL1.AMOUNT,TBL1.DATETIME,TBL1.SENDER, TBL1.RECIPIENT 
HAVING SUM(TBL1.AMOUNT) > 2000;

--- 0 результат ---

Но это не работает. Надеюсь, кто-нибудь может дать мне представление о том, как решить проблему.


person glennlosentes    schedule 25.07.2016    source источник


Ответы (2)


Вот один из способов:

select t.*
from sourcetable t
where sender in (select t2.sender
                 from sourcetable t2
                 where t2.datetime >= '2015-05-01' and t2.datetime <= '2016-07-26'
                 group by t2.sender
                 having sum(t2.amount) > 2000
                ) and 
      t.datetime >= '2015-05-01' and t.datetime <= '2016-07-26';

Подзапрос генерирует список отправителей, соответствующих критериям. Затем внешний запрос выбирает строки.

person Gordon Linoff    schedule 25.07.2016

Альтернативный подход: он сочетает в себе два ожидаемых результата.

SELECT T1.* FROM <Table> T1 INNER JOIN (
SELECT Sender FROM <table> T GROUP BY Sender HAVING SUM(Amount) > 2000) AS T2 ON T1.Sender = T2.Sender ORDER BY T1.Sender
UNION
SELECT T3.* FROM <Table> T3 INNER JOIN (
SELECT Sender FROM <table> T GROUP BY Sender HAVING SUM(Amount) < 2000) AS T4 ON T3.Sender = T4.Sender ORDER BY T3.Sender
person The Shooter    schedule 25.07.2016