diff --git a/solution/0600-0699/0615.Average Salary Departments VS Company/README.md b/solution/0600-0699/0615.Average Salary Departments VS Company/README.md index 5266c104fd780..0aa7c3909e9fb 100644 --- a/solution/0600-0699/0615.Average Salary Departments VS Company/README.md +++ b/solution/0600-0699/0615.Average Salary Departments VS Company/README.md @@ -105,4 +105,35 @@ SELECT DISTINCT FROM t; ``` +```sql +# Write your MySQL query statement below +WITH + S AS ( + SELECT * + FROM + Salary + JOIN Employee USING (employee_id) + ), + T AS ( + SELECT + date_format(pay_date, '%Y-%m') AS pay_month, + department_id, + avg(amount) OVER ( + PARTITION BY pay_date, department_id + ) AS department_avg, + avg(amount) OVER (PARTITION BY pay_date) AS company_avg + FROM S + ) +SELECT + pay_month, + department_id, + CASE + WHEN avg(department_avg) > avg(company_avg) THEN 'higher' + WHEN avg(department_avg) < avg(company_avg) THEN 'lower' + ELSE 'same' + END AS comparison +FROM T +GROUP BY 1, 2; +``` + diff --git a/solution/0600-0699/0615.Average Salary Departments VS Company/README_EN.md b/solution/0600-0699/0615.Average Salary Departments VS Company/README_EN.md index 40d1f5528f9c7..01bb02472ca0d 100644 --- a/solution/0600-0699/0615.Average Salary Departments VS Company/README_EN.md +++ b/solution/0600-0699/0615.Average Salary Departments VS Company/README_EN.md @@ -116,4 +116,35 @@ SELECT DISTINCT FROM t; ``` +```sql +# Write your MySQL query statement below +WITH + S AS ( + SELECT * + FROM + Salary + JOIN Employee USING (employee_id) + ), + T AS ( + SELECT + date_format(pay_date, '%Y-%m') AS pay_month, + department_id, + avg(amount) OVER ( + PARTITION BY pay_date, department_id + ) AS department_avg, + avg(amount) OVER (PARTITION BY pay_date) AS company_avg + FROM S + ) +SELECT + pay_month, + department_id, + CASE + WHEN avg(department_avg) > avg(company_avg) THEN 'higher' + WHEN avg(department_avg) < avg(company_avg) THEN 'lower' + ELSE 'same' + END AS comparison +FROM T +GROUP BY 1, 2; +``` + diff --git a/solution/0600-0699/0615.Average Salary Departments VS Company/Solution.sql b/solution/0600-0699/0615.Average Salary Departments VS Company/Solution.sql index 97807a9287376..0cf4bec8ec2ab 100644 --- a/solution/0600-0699/0615.Average Salary Departments VS Company/Solution.sql +++ b/solution/0600-0699/0615.Average Salary Departments VS Company/Solution.sql @@ -1,23 +1,28 @@ # Write your MySQL query statement below WITH - t AS ( + S AS ( + SELECT * + FROM + Salary + JOIN Employee USING (employee_id) + ), + T AS ( SELECT date_format(pay_date, '%Y-%m') AS pay_month, department_id, - avg(amount) OVER (PARTITION BY pay_date) AS company_avg_amount, avg(amount) OVER ( PARTITION BY pay_date, department_id - ) AS department_avg_amount - FROM - Salary AS s - JOIN Employee AS e ON s.employee_id = e.employee_id + ) AS department_avg, + avg(amount) OVER (PARTITION BY pay_date) AS company_avg + FROM S ) -SELECT DISTINCT +SELECT pay_month, department_id, CASE - WHEN company_avg_amount = department_avg_amount THEN 'same' - WHEN company_avg_amount < department_avg_amount THEN 'higher' - ELSE 'lower' + WHEN avg(department_avg) > avg(company_avg) THEN 'higher' + WHEN avg(department_avg) < avg(company_avg) THEN 'lower' + ELSE 'same' END AS comparison -FROM t; +FROM T +GROUP BY 1, 2; diff --git a/solution/0600-0699/0618.Students Report By Geography/README.md b/solution/0600-0699/0618.Students Report By Geography/README.md index 066c0feb8734e..7eed05ae5dd90 100644 --- a/solution/0600-0699/0618.Students Report By Geography/README.md +++ b/solution/0600-0699/0618.Students Report By Geography/README.md @@ -60,31 +60,32 @@ Student table: +**方法一:窗口函数 + GROUP BY** + +我们可以使用窗口函数 `row_number()` 来为每个大洲的学生编号,然后使用 `GROUP BY` 来将同一编号的学生聚合到一行中。 + ### **SQL** ```sql # Write your MySQL query statement below -with t as ( - select - *, - row_number() over( - partition by continent - order by - name - ) rn - from - Student -) -select - max(if(continent = 'America', name, null)) America, - max(if(continent = 'Asia', name, null)) Asia, - max(if(continent = 'Europe', name, null)) Europe -from - t -group by - rn +WITH + T AS ( + SELECT + *, + row_number() OVER ( + PARTITION BY continent + ORDER BY name + ) AS rk + FROM Student + ) +SELECT + max(if(continent = 'America', name, NULL)) AS 'America', + max(if(continent = 'Asia', name, NULL)) AS 'Asia', + max(if(continent = 'Europe', name, NULL)) AS 'Europe' +FROM T +GROUP BY rk; ``` diff --git a/solution/0600-0699/0618.Students Report By Geography/README_EN.md b/solution/0600-0699/0618.Students Report By Geography/README_EN.md index 9a421d7f5e874..8a05c0836fbdb 100644 --- a/solution/0600-0699/0618.Students Report By Geography/README_EN.md +++ b/solution/0600-0699/0618.Students Report By Geography/README_EN.md @@ -61,25 +61,22 @@ Student table: ```sql # Write your MySQL query statement below -with t as ( - select - *, - row_number() over( - partition by continent - order by - name - ) rn - from - Student -) -select - max(if(continent = 'America', name, null)) America, - max(if(continent = 'Asia', name, null)) Asia, - max(if(continent = 'Europe', name, null)) Europe -from - t -group by - rn +WITH + T AS ( + SELECT + *, + row_number() OVER ( + PARTITION BY continent + ORDER BY name + ) AS rk + FROM Student + ) +SELECT + max(if(continent = 'America', name, NULL)) AS 'America', + max(if(continent = 'Asia', name, NULL)) AS 'Asia', + max(if(continent = 'Europe', name, NULL)) AS 'Europe' +FROM T +GROUP BY rk; ``` diff --git a/solution/0600-0699/0618.Students Report By Geography/Solution.sql b/solution/0600-0699/0618.Students Report By Geography/Solution.sql index d27032bf9f180..527785f1431e0 100644 --- a/solution/0600-0699/0618.Students Report By Geography/Solution.sql +++ b/solution/0600-0699/0618.Students Report By Geography/Solution.sql @@ -1,17 +1,17 @@ # Write your MySQL query statement below WITH - t AS ( + T AS ( SELECT *, row_number() OVER ( PARTITION BY continent ORDER BY name - ) AS rn + ) AS rk FROM Student ) SELECT - max(if(continent = 'America', name, NULL)) AS America, - max(if(continent = 'Asia', name, NULL)) AS Asia, - max(if(continent = 'Europe', name, NULL)) AS Europe -FROM t -GROUP BY rn; + max(if(continent = 'America', name, NULL)) AS 'America', + max(if(continent = 'Asia', name, NULL)) AS 'Asia', + max(if(continent = 'Europe', name, NULL)) AS 'Europe' +FROM T +GROUP BY rk;