2012-06-28 82 views
1

我有許多LEFT JOIN子句有7個結果列,其中最後兩個是數字以下查詢。我期待的count_non_zero列總是等於count_total柱(給出的數據我目前已經)SQL LEFT JOIN查找非零值爲零

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得到不存在的計數的結果。任何人有任何想法?

+0

我不清楚你的問題。你是說count_non_zero會回到NULL或零或等於count_total或其他東西? – ongle

+0

我在說有一種情況,例如count_non_zero回到1時它應該是3.沒有值爲零,因此給定我的當前數據集,兩列應在每行中具有相同的值。 ......但一旦我開始增加零薪水值,它也應該正常工作。 –

+1

請提供一些演示問題的示例數據,並指出您期望的結果。將列和聯接的數量減少到減少問題所需的最小數量可能會有所幫助。我認爲很多人都沒有高度的動力去弄清楚「有什麼情況」可能意味着簡單地通過逆向工程查詢。請閱讀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_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值,則可能會出現問題。

+0

非常感謝您的意見。很有幫助。你們是救生員。 –