2017-04-25 1 views
0

이 같은 결과를 표시하는 쿼리가 있습니다MYSQL 쿼리 행을 제거

Zip | Left Price | Right Price 
17901 | 100.00  | null 
17820 | null  | 40.00 
54353 | null  | null 
53133 | 40.00  | 542.00 

이 어떻게 왼쪽과 가격 가격 널 (null)로 한 결과를 제거 할 수 있습니다. 그래서 나는 그 결과에 우편 번호 54353이 나타나기를 원하지 않을 것입니다. 당신은 다음과 같이 결국 HAVING 절을 추가 할 수 있습니다

SELECT contacts.zip, CASE WHEN 
left_return_date IS NULL AND left_delivery_date IS NOT NULL AND left_price 
IS NOT NULL THEN left_price ELSE null END AS left_price, CASE WHEN 
right_return_date IS NULL AND right_delivery_date IS NOT NULL AND 
right_price IS NOT NULL THEN right_price ELSE null END AS right_price 
FROM invoice_hearing_aids 
LEFT JOIN invoices ON invoices.ID = invoice_hearing_aids.invoice_id 
LEFT JOIN contacts ON contacts.id = invoices.contact_id 
WHERE 
trial_complete = 'Y' 
AND invoices.company_id = '1' 
AND invoices.date_issued >= DATE_SUB(NOW(),INTERVAL 1 YEAR) 
+0

문제는 무엇인가? – Jenish

답변

0

: 당신이 원하지 않는 상대적으로 적은 수의 경우

SELECT contacts.zip, CASE WHEN 
left_return_date IS NULL AND left_delivery_date IS NOT NULL AND left_price 
IS NOT NULL THEN left_price ELSE null END AS left_price, CASE WHEN 
right_return_date IS NULL AND right_delivery_date IS NOT NULL AND 
right_price IS NOT NULL THEN right_price ELSE null END AS right_price 
FROM invoice_hearing_aids 
LEFT JOIN invoices ON invoices.ID = invoice_hearing_aids.invoice_id 
LEFT JOIN contacts ON contacts.id = invoices.contact_id 
WHERE 
trial_complete = 'Y' 
AND invoices.company_id = '1' 
AND invoices.date_issued >= DATE_SUB(NOW(),INTERVAL 1 YEAR) 
HAVING 
    right_price IS NOT NULL OR left_price IS NOT NULL 

이 잘 작동 것 여기

내가 내 쿼리를 한 방법 레코드 (총 결과 집합 크기의 최대 50 %까지이 작업을 수행합니다). 그러한 레코드가 더 있으면 쿼리에 더 가까이 다가가 조건을 수정할 가능성이 높습니다.

0

수행 left_price 및 right_price 당신이 ADDA 수있는 열 값은 그 AFCT 곳 조건

SELECT contacts.zip, 
     CASE WHEN left_return_date IS NULL 
      AND left_delivery_date IS NOT NULL 
      AND left_price IS NOT NULL THEN left_price 
      ELSE null END AS left_price, 
     CASE WHEN right_return_date IS NULL 
      AND right_delivery_date IS NOT NULL 
      AND right_price IS NOT NULL THEN right_price 
      ELSE null END AS right_price 
    FROM invoice_hearing_aids 
    LEFT JOIN invoices ON invoices.ID = invoice_hearing_aids.invoice_id 
    LEFT JOIN contacts ON contacts.id = invoices.contact_id 
    WHERE 
    trial_complete = 'Y' 
    AND invoices.company_id = '1' 
    AND invoices.date_issued >= DATE_SUB(NOW(),INTERVAL 1 YEAR) 
    AND NOT (left_price IS NULL AND right_price IS NULL) 
+0

테이블에서 null이 아닌 레코드를 필터링하지 않지만'CASE'의 다른 조건은 레코드를 null로 표시합니다. 예를 들어,'left_delivery_date' 및'right_delivery_date '가 null 인 경우입니다. –

+0

HAVING 상태가 현재 작동하는 것처럼 보였습니다. HAVING을 사용하지 않기 위해 쿼리를 작성하는 더 좋은 방법이 있는지 궁금합니다. 그게 더 나아질까요? 그래도 도움을 주셔서 감사합니다. –

+1

데이터가 결과에 필터가 필요하지 않지만 추가 된 조건을 사용하여 조건을 올바르게 사용할 수없는 경우 제안 된 쿼리를 사용할 수 없으므로 ... 불행한 행을 선택하지 마십시오.하지만이 제안은 데이터에 따라 다릅니다. 함유량 – scaisEdge

관련 문제