1

我有以下查询,其中包含许多具有 7 个结果列的 LEFT JOIN 子句,其中最后两个是数字。我期望 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 得到不存在的计数。有人有什么想法吗?

4

1 回答 1

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 值,您可能会遇到问题。

于 2012-06-28T02:28:14.150 回答