SQL LEFT JOIN将非零值发现为零

时间:2012-06-28 01:43:46

标签: sql sql-server left-join

我有许多LEFT JOIN子句有以下查询,这些子句有7个结果列,最后两个是数字。我期望count_non_zero列始终等于count_total列(给定我当前拥有的数据)

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;

我运行此查询以证明'salary'列中的值没有返回值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得到不存在的计数的结果。有人有任何想法吗?

1 个答案:

答案 0 :(得分:2)

我假设你的count_total大于你的count_non_zero。这是可以预料到的,因为您使用外部联接来加入user_job_internship和salary_internship。

您的查询包括没有任何实习机会的公司。如果薪水为0 ,如果根本没有实习,公司将不会包含在count_non_zero中。

将这两个连接更改为内连接,您应该得到预期的结果。

另一种选择是更改您的count_total以忽略没有实习的公司

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

你还有一个轻微的风险。您的count_non_zero正在计算company_name,而您的count_total正在计算company_name_id。如果company_name列允许NULL值,则可能会出现问题。