LeetCode sql每日刷题 3 (按照出现频率)

579. 查询员工的累计薪水Employee 表保存了一年内的薪水信息。

请你编写 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路

  1. 先求员工最近3月的累计薪资
  2. 然后将最近一个月工资移去

代码

-- 先做自连接
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

1084.销售分析

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'

1193.每月交易I

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

你可能感兴趣的:(数据库,SQL,数据分析)