请你编写 SQL 语句,来查询一个员工三个月内的累计薪水,但是不包括最近一个月的薪水。
结果请按 ‘Id’ 升序,然后按 ‘Month’ 降序显示。
示例:
输入:
Id | Month | Salary |
---|---|---|
1 | 1 | 20 |
2 | 1 | 20 |
1 | 2 | 30 |
2 | 2 | 30 |
3 | 2 | 40 |
1 | 3 | 40 |
3 | 3 | 60 |
1 | 4 | 60 |
3 | 4 | 70 |
输出:
Id | Month | Salary |
---|---|---|
1 | 3 | 90 |
1 | 2 | 50 |
1 | 1 | 20 |
2 | 1 | 20 |
3 | 3 | 100 |
3 | 2 | 40 |
解释:
员工 ‘1’ 除去最近一个月(月份 ‘4’),有三个月的薪水记录:月份 ‘3’ 薪水为 40,月份 ‘2’ 薪水为 30,月份 ‘1’ 薪水为 20。
所以近 3 个月的薪水累计分别为 (40 + 30 + 20) = 90,(30 + 20) = 50 和 20。
Id | Month | Salary |
---|---|---|
1 | 3 | 90 |
1 | 2 | 50 |
1 | 1 | 20 |
员工 ‘2’ 除去最近的一个月(月份 ‘2’)的话,只有月份 ‘1’ 这一个月的薪水记录。
Id | Month | Salary |
---|---|---|
2 | 1 | 20 |
员工 ‘3’ 除去最近一个月(月份 ‘4’)后有两个月,分别为:月份 ‘4’ 薪水为 60 和 月份 ‘2’ 薪水为 40。所以各月的累计情况如下:
Id | Month | Salary |
---|---|---|
3 | 3 | 100 |
3 | 2 | 40 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-cumulative-salary-of-an-employee
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
代码
-- 先做自连接
SELECT *
FROM
Employee E1
LEFT JOIN
Employee E2 ON (E2.id = E1.id
AND E2.month = E1.month - 1)
LEFT JOIN
Employee579 e3
on (e3.id = e1.id AND e3.`Month` =e1.`Month`-2)
ORDER BY E1.id ASC , E1. month DESC
得到每个员工三个月的累计薪资
-- 求累计薪资
SELECT
E1.id,
E1.month,
(IFNULL(E1.salary, 0) + IFNULL(E2.salary, 0) + IFNULL(E3.salary, 0)) AS Salary
FROM
Employee E1
LEFT JOIN
Employee E2 ON (E2.id = E1.id
AND E2.month = E1.month - 1)
LEFT JOIN
Employee E3 ON (E3.id = E1.id
AND E3.month = E1.month - 2)
ORDER BY E1.id ASC , E1.month DESC
生成一个包含员工id和最近一个月是几月的临时表
SELECT id,MAX(`Month`) as `Month`
FROM employee579
GROUP BY id
HAVING COUNT(*) > 1
合并代码
E1.ID,
e1.`Month`,
(
IFNULL( e1.Salary, 0 ) + IFNULL( e2.Salary, 0 ) + IFNULL( e3.salary, 0 )
) AS salary
FROM
employee579 e1
LEFT JOIN employee579 e2 ON ( e2.id = e1.id AND e2.`Month` = e1.`Month` - 1 )
LEFT JOIN employee579 e3 ON ( e3.id = e1.id AND e3.MONTH = e1.MONTH - 2 )
ORDER BY
e1.id ASC,
e1.`Month` DESC;
SELECT
id,
MAX( `Month` ) AS `Month`
FROM
employee579
GROUP BY
id
HAVING
COUNT( * ) > 1;
SELECT
e1.id,
e1.`Month`,
(
IFNULL( e1.salary, 0 ) + IFNULL( e2.salary, 0 ) + IFNULL( e3.Salary, 0 )
) AS Salary
FROM
( SELECT id, max( MONTH ) AS MONTH FROM employee579 GROUP BY id HAVING COUNT( * ) > 1 ) AS maxmonth
LEFT JOIN employee579 e1 ON ( maxmonth.id = e1.id AND maxmonth.`Month` > e1.MONTH )
LEFT JOIN employee579 e2 ON ( e2.id = e1.id AND e2.`Month` = e1.`Month` - 1 )
LEFT JOIN employee579 e3 ON ( e3.id = e1.id AND e3.`Month` = e1.`Month` - 2 )
ORDER BY
id ASC,
`Month` DESC
Column Name | Type |
---|---|
product_id | int |
product_name | varchar |
unit_price | int |
product_id 是这个表的主键
Table: Sales
Column Name | Type |
---|---|
seller_id | int |
product_id | int |
buyer_id | int |
sale_date | date |
quantity | int |
price | int |
这个表没有主键,它可以有重复的行.
product_id 是 Product 表的外键.
编写一个SQL查询,报告2019年春季才售出的产品。即在2019-01-01至2019-03-31(含)之间。
查询结果格式如下所示:
Product table:
product_id | product_name | unit_price |
---|---|---|
1 | S8 | 1000 |
2 | G4 | 800 |
3 | iPhone | 1400 |
Sales table:
seller_id | product_id | buyer_id | sale_date | quantity | price |
---|---|---|---|---|---|
1 | 1 | 1 | 2019-01-21 | 2 | 2000 |
1 | 2 | 2 | 2019-02-17 | 1 | 800 |
2 | 2 | 3 | 2019-06-02 | 1 | 800 |
3 | 3 | 4 | 2019-05-13 | 2 | 2800 |
Result table:
product_id | product_name |
---|---|
1 | S8 |
id为1的产品仅在2019年春季销售,其他两个产品在之后销售。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sales-analysis-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
1.用group by 将产品 id 分组
2.having 限制出售时间为2019年春季
代码
SELECT
product.product_id,
product_name
FROM
product
LEFT JOIN sales ON product.product_id = sales.product_id
GROUP BY
product.product_id
HAVING
MIN( sale_date ) >= '2019-01-01'
AND max( sale_date ) <= '2019-03-31'
Table: Transactions
Column Name | Type |
---|---|
id | int |
country | varchar |
state | enum |
amount | int |
trans_date | date |
id 是这个表的主键。
该表包含有关传入事务的信息。
state 列类型为 “[”批准“,”拒绝“] 之一。
编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。
查询结果格式如下所示:
Transactions table:
id | country | state | amount | trans_date |
---|---|---|---|---|
121 | US | approved | 1000 | 2018-12-18 |
122 | US | declined | 2000 | 2018-12-19 |
123 | US | approved | 2000 | 2019-01-01 |
124 | DE | approved | 2000 | 2019-01-07 |
Result table:
month | country | trans_count | approved_count | trans_total_amount | approved_total_amount |
---|---|---|---|---|---|
2018-12 | US | 2 | 1 | 3000 | 1000 |
2019-01 | US | 1 | 1 | 2000 | 2000 |
2019-01 | DE | 1 | 1 | 2000 | 2000 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monthly-transactions-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码
SELECT DATE_FORMAT(trans_date,"%Y-%m") as month,
country,
COUNT(*) as trans_count,
SUM(if(State='approved',1,0)) as approved_count,
SUM(amount) as trans_total_amount,
SUM(IF(state='approved',amount,0)) as approved_total_amount
FROM transactions
GROUP BY Month,country