我有许多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得到不存在的计数的结果。有人有任何想法吗?
答案 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值,则可能会出现问题。