SQL每日一練【180605】

SQL每日一練【180605】

題目:匯總各個部門當前員工的title類型的分配數目_牛客網

來源:牛客網

匯總各個部門當前員工的title類型的分配數目,結果給出部門編號dept_no、dept_name、其當前員工所有的title以及該類型title對應的數目count

CREATE TABLE `departments` (

`dept_no` char(4) NOT NULL,

`dept_name` varchar(40) NOT NULL,

PRIMARY KEY (`dept_no`));

CREATE TABLE `dept_emp` (

`emp_no` int(11) NOT NULL,

`dept_no` char(4) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE IF NOT EXISTS `titles` (

`emp_no` int(11) NOT NULL,

`title` varchar(50) NOT NULL,

`from_date` date NOT NULL,

`to_date` date DEFAULT NULL);

select de.dept_no, de.dept_name, t1.title, t1.emp_count as count

from (select d.dept_no, t.title, count(emp_no) as emp_count

from dept_emp d inner join titles t on d.emp_no = t.emp_no

where d.to_date = "9999-01-01" and t.to_date = "9999-01-01"

group by d.dept_no, t.title) as t1 inner join departments de on t1.dept_no = de.dept_no;


我的解答:

select de.dept_no, de.dept_name, t1.title, t1.emp_count as countfrom (select d.dept_no, t.title, count(t.emp_no) as emp_countfrom dept_emp d inner join titles t on d.emp_no = t.emp_nowhere d.to_date = "9999-01-01" and t.to_date = "9999-01-01"group by d.dept_no, t.title) as t1 inner join departments de on t1.dept_no = de.dept_no;

牛客網上提供的答案:

SELECT de.dept_no, dp.dept_name, t.title, COUNT(t.title) AS countFROM titles AS t INNER JOIN dept_emp AS de ON t.emp_no = de.emp_no AND de.to_date = 9999-01-01 AND t.to_date = 9999-01-01INNER JOIN departments AS dp ON de.dept_no = dp.dept_noGROUP BY de.dept_no, t.title

對比我的答案和牛客網提供的答案,有以下不同:

1)對於題目的理解。count部分我用了emp_no,因為我覺得計算同一個title的數量說到底還是算有這個title的人頭有多少;但其實按照參考答案的,計算這個title出現的次數也是可行的。感覺這裡我的思維稍微繞了個彎。

2)我用了子查詢,但是參考答案沒有。現階段沒看出運行上有什麼差異……

小疑問:

關於count。當我看到「t1.emp_count as count」里的第二個count被標紅的時候還以為SQL像python一樣,不能用和關鍵字一樣的名字去命名欄位,後來發現是多慮了。


推薦閱讀:

MySQL |Self Join
MySQL5.7.17 編譯安裝及二進位安裝詳解
MySQL資料庫應用總結(九)—MySQL資料庫視圖的操作
MySQL資料庫應用總結(四)—MySQL資料庫表的基本操作(上)
半同步複製介紹

TAG:MySQL | SQL | 資料庫 |