2014-01-17 4 views
0

지난 6 주간 인보이스가 작성되지 않은 모든 고객을 나열하는 데 어려움을 겪고 있습니다. 두 테이블에 클라이언트와 송장이 관련되어 있습니다.지난 6 주간 인보이스가 작성되지 않은 고객, MySQL

select MAX(invoice.created_date) 'Last Invoice Date', invoice.invoice_no 'Invoice No.', DATEDIFF(curdate(), max(invoice.created_date)) 'Days since last invoice created', client.name 'Client' 
from invoice 
left join 
client on invoice.client_id = client.id 
where 
datediff (curdate(), (select MAX(invoice.created_date) from invoice left join client on invoice.client_id = client.id)) > 42 
group by client.id; 

을하지만 빈 집합을 반환 : 나의 현재 쿼리는 다음과 같습니다. 도움이 필요하십니까

답변

0

인보이스에서 가입을 시작하면 곧바로 인보이스가없는 모든 고객이 제외됩니다. 당신은 지난 X 일에는 송장 만 잡아 클라이언트에 EXISTS 절을 사용 후 클라이언트에서 시작하고 선택에 필요한 정보를 얻기 위해 송장에 가입 할 수 있습니다

SELECT MAX(invoice.created_date) 'Last Invoice Date', invoice.invoice_no 'Invoice No.', DATEDIFF(curdate(), max(invoice.created_date)) 'Days since last invoice created', client.name 'Client' 
FROM client c 
LEFT JOIN invoice i ON (i.client_id = c.id) 
WHERE NOT EXISTS(
    SELECT 1 FROM invoice i2 
    WHERE i2.client_id = c.id 
    AND DATE_SUB(NOW(), INTERVAL 42 DAY) < i2.created_date 
) 
GROUP BY c.id; 
+0

안녕 짐! 실제적으로 모든 고객에게 인보이스가 있다고 가정 해 봅시다. 모든 인보이스는 개별적으로 저장되며 고유 한 날짜가 있습니다. 당신이 제안한 쿼리는 지난 42 일 동안 인보이스가있는 클라이언트도 반환하지만 원하지 않습니다. 나는 최근 created_date가 "datediff (curdate(), i2.created_date)> 42)가 아니기 때문에 EXIST 내에 있다고 생각한다." 나는 max (i2.created_date)와 같은 것을 원하지만 물론 거기에 허용되지 않습니다. 아이디어가 있으십니까? –

+0

@ErindPepi 지난 42 일 동안 일치하는 인보이스가 있으면 조건이 false가되기 때문에 존재하는 곳에서 최대 값은 필요 없습니다. 내가 사용하는 쿼리를 표시하기 위해 함께 넣어 SQL 바이올린을 얻을거야. – Jim

+0

@ErindPepi'datediff' 부분이 오작동하는 것 같아서 내가 바꿨습니다. 사용 가능한 예 [here] (http://sqlfiddle.com/#!2/e5c70/2). – Jim