2012-06-28 2 views
1

7 개의 결과 열이있는 많은 LEFT JOIN 절이있는 다음 쿼리가 있습니다. 마지막 두 개는 숫자입니다. 나는SQL LEFT JOIN 0이 아닌 값을 0으로 찾음

WITH temp_table AS ( 
SELECT 
    attr.company_name_id AS option_id, 
    attr.company_name AS option_name, 
    uj.internship_company_name_id, 
    AVG(CASE WHEN s.salary > 0 THEN s.salary END) AS average, 
    COUNT(CASE WHEN s.salary > 0 THEN attr.company_name END) as count_non_zero, 
    COUNT(attr.company_name_id) as count_total 
FROM company_name attr 
    LEFT JOIN user_job_internship uj ON uj.internship_company_name_id = attr.company_name_id 
     AND attr.approved_by_administrator = 1 
    LEFT JOIN salary_internship s ON uj.user_job_internship_id = s.user_job_id 
     AND uj.job_type_id = 4 
    LEFT JOIN [user] u ON u.user_id = uj.user_id AND u.include_in_student_site_results = 1 
     AND u.site_instance_id IN (1) 
    LEFT JOIN user_education_mba_school mba ON u.user_id = mba.user_id 
     AND mba.mba_graduation_year_id NOT IN (8) 
GROUP BY attr.company_name_id, attr.company_name, uj.internship_company_name_id) 
SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY average DESC) AS row, * 
FROM temp_table WHERE count_total >= 3) sub 
WHERE row >= 1 AND row <= 25 ORDER BY average DESC; 

내가 '급여'열에서 모든 값의 값을 반환하지 않습니다 것을 증명하기 위해이 쿼리를 실행 (데이터 I 전류가 한 부여) 항상 count_total 열 같도록 count_non_zero 열을 기대하고 있습니다 0

SELECT s.* FROM user_job_internship uj, salary_internship s 
where internship_company_name_id = 440 
AND uj.user_job_internship_id = s.user_job_id 

나는 존재하지 않는 수를 얻을 수있는 count_non_zero의 원인이되는 결과를 망쳐 놨 뭔가가 생각하고 있어요. 누구든지 의견이 있으십니까?

+0

질문에 불분명합니다. count_non_zero가 NULL이나 count_total 또는 완전히 다른 값으로 돌아오고 있다고 말하는 것입니까? – ongle

+0

예를 들어, count_non_zero가 3 일 때 1로 되돌아 오는 시나리오가 있다고 말하고 있습니다. 제로의 값이 없으므로 현재 데이터 세트가 주어 지므로 두 열 모두 각 행에서 동일한 값을 가져야합니다. ...하지만 일단 제로 급여 값을 추가하기 시작하면 제대로 작동해야합니다. –

+1

문제를 나타내는 샘플 데이터를 제공하고 예상 결과를 나타내십시오. . 제를 줄이기 위해 필요한 열 W 조인의 수를 줄이는 것이 도움이 될 수 있습니다. 나는 많은 사람들이 "시나리오가있다"라는 것이 쿼리를 리버스 엔지니어링함으로써 단순히 의미 할 수도있는 것을 파악하도록 동기를 부여 받았다고 생각하지 않는다. http://dba.blogoverflow.com/2012/06/help-us-help-you/ –

답변

2

귀하의 count_total이 count_non_zero보다 큰 것으로 가정합니다. user_job_internship과 salary_internship에 가입하기 위해 외부 조인을 사용하기 때문에 예상됩니다.

귀하의 질의에는 인턴십이없는 회사가 포함됩니다. 인턴쉽이 전혀없는 경우 급여가 0 또는 인 경우 회사가 count_non_zero에 포함되지 않습니다.

두 조인을 내부 조인으로 변경하면 예상 한 결과가 나타납니다.

다른 옵션은 당신이 다른 하나 개의 약간의 위험이되지 않은 인턴

count(case when s.user_job_id is not null then attr.company_name_id end) as count_total 

이 회사를 무시하도록 count_total을 변경하는 것입니다. count_non_zero는 company_name을 계산하고 count_total은 company_name_id를 계산합니다. company_name 열에서 NULL 값을 허용하면 문제가 발생할 수 있습니다.

+0

귀하의 의견에 많은 감사드립니다. 매우 도움이됩니다. 너희들은 생명의 은인이야. –