1

7 つの結果列を持つ多くの LEFT JOIN 句を含む次のクエリがあり、そのうちの最後の 2 つは数値です。私は 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;

このクエリを実行して、「給与」列の値が 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 に含まれません。

これら 2 つの結合を内部結合に変更すると、期待どおりの結果が得られるはずです。

もう 1 つのオプションは、count_total を変更して、インターンシップを行っていない企業を無視することです。

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

もう 1 つ、わずかなリスクがあります。count_non_zero は company_name をカウントしていますが、count_total は company_name_id をカウントしています。company_name 列で NULL 値が許可されている場合、問題が発生する可能性があります。

于 2012-06-28T02:28:14.150 に答える