2017-10-23 3 views
0
select contract.id, invoice.period_to 
from public.invoice 
right join public.contract on invoice.contract_id = contract.id 
where (MAX(invoice.period_to) <= '2017-10-01' OR invoice.id IS NULL) 
     ^^^^^^^^^^^^^^^^^^^^^ - I need help here 
AND contract.close_type IS NULL 
    AND contract.payment_type != 'TRIAL' 
    group by contract.id; 

Ich weiß, ich MAX unter Verwendung kippe WHERE so im versuchen, so etwas wieSQL MAX in WHERE

where (invoice.period_to IN(SELECT MAX(invoice.period_to) FROM public.invoice GROUP BY invoice.period_to) <= '2017-10-01' OR invoice.id IS NULL) 

Aber Fehler ERROR: invalid value for logical type: "2017-10-01"

mich tun Hilfe pls

+1

Aggregatfilter sollten in eine 'have'-Klausel gestellt werden, nicht in die' where'-Klausel. – Igor

+1

HABEN ist was du suchst. –

+0

Mögliches Duplikat von [Sql Server: Verwendung einer Aggregatfunktion wie MAX in einer WHERE-Klausel] (https://stackoverflow.com/questions/1475589/sql-server-how-to-use-an-aggregate-function- like-max-in-a-where-Klausel) –

Antwort

2

Vermutlich Sie wollen:

select c.id, max(i.period_to) 
from public.contract c left join 
    public.invoice 
    on i.contract_id = c.id 
where c.close_type IS NULL and c.payment_type <> 'TRIAL' 
group by c.id 
having max(i.period_to) <= '2017-10-01' OR max(i.id) IS NULL; 
+0

Thx. Das ist was ich will. Eine kleine Sache, die mich verwirrt ist: OR max (i.id) IS NULL, aber ich denke, ohne MAX es funktioniert nicht unter HABEN –

+1

@AntonKolosok Sie müssen angeben, welche Aggregat Sie in 'haben' verwenden möchten, weil es aggregiert Filterung, aber es ist nicht auf die Verwendung derselben Aggregate beschränkt, die Sie bereits in der 'select'-Klausel verwendet haben. Sie können beispielsweise nach Monat gruppieren und dann das letzte ("max") Datum in jeder Gruppe auswählen, jedoch nur dort, wo das früheste ("min") Datum in jeder Gruppe vor oder nach einem bestimmten Schwellenwert liegt oder usw. –