2016-11-14 31 views
0

下面是我爲這個問題創建了一個名爲「Salary_table」的數據表: enter image description here即使該存儲桶中的項目計數爲0,如何使用大小寫聲明保留存儲桶?

所以我想找到每個部門的每個薪金桶的員工數量。桶是

"<$100" "$100-$200" and ">$200" 

所需的輸出是:

enter image description here

下面是我爲實現這一任務的代碼:

select distinct(st.department) as "Department", 
sb.salary_bucket as "salary range", count(*) 
from Salary_table st 
Left join (
    select department, employee, case 
     when salary < 100 then "<$100" 
     when salary between 100 and 200 then "$100-$200" 
     else ">$200" 
     end 
     as salary_bucket 
    from Salary_table 
) sb 
on sb.employee = st.employee 
group by st.department, sb.salary_bucket 
order by st.department, sb.salary_bucket 
; 

,但我的輸出是有點短的什麼IM期待:

enter image description here

有兩個問題,我的電流輸出:

  1. 0員工收入的工資在桶範圍內未列出的桶;我想它被列爲一個值爲「0」
  2. 儘管我在聲明「order by」中添加了薪水桶,但它並不是正確的順序,但我認爲它是b/c的文本,所以不能真正去做。

我真的很感激一些提示和指導如何解決/實現上面提到的這兩個問題。非常感謝!

我已經試過

  1. 我試圖用「左連接」,但輸出師出同
  2. 我嘗試「按訂單」的條款加入,但似乎沒有對文字工作桶
+0

哪些DBMS您使用的?另外:'distinct'是** NOT **的一個函數。它始終適用於選擇列表中的所有列 –

+0

嗨@a_horse_with_no_name,非常感謝您的回覆!我沒有使用任何特定的DBMS,因爲我仍在學習SQL。我從這裏學習使用「獨特」:http://www.w3schools.com/sql/sql_distinct.asp。這不是一個功能? – alwaysaskingquestions

回答

1

你是在正確的軌道上,但這個想法有點複雜。使用cross join獲取所有行 - 桶和部門。然後使用left join的匹配信息,使最後group by的聚合:

select d.department, b.salary_bucket, 
     count(sb.department) as cnt 
from (select '<$100' as salary_bucket union all 
     select '$100-$200' union all 
     select '>$200' 
    ) b cross join 
    (select distinct department from salary_table 
    ) d left join 
    (select department, employee, 
      (case when salary < 100 then '<$100' 
        when salary between 100 and 200 then '$100-$200' 
        else '>$200' 
       end) as salary_bucket 
     from Salary_table 
    ) sb 
    on sb.department = d.department and 
     sb.salary_bucket = b.salary_bucket 
group by d.department, b.salary_bucket; 
+0

嗨戈登,非常感謝您的快速回答!對此,我真的非常感激。然而,由於我是SQL新手,我並不熟悉「交叉連接」,儘管我已經閱讀過它並知道它主要用於查找員工的經理等。您能否更詳細地解釋一下交叉加入這裏?也爲什麼要使用所有的工會呢? – alwaysaskingquestions

+0

'union all'生成桶。 '交叉連接'生成行。運行子查詢和「交叉連接」作爲獨立查詢來查看他們的工作。 –

+0

非常感謝!將玩弄它並盡我所能去理解。但至少當我嘗試你的代碼時,它產生了我想要的東西!所以謝謝! – alwaysaskingquestions

相關問題