14.有如下两张表:
交易表deli_t:
日期Busi_date 交易时间Exch_time 客户编号Cust_piy_no 交易类型Exch_type 产品代码Prd_no 交易量Del_amt 机构编号Org_no
20170101 93102 0312003 证券买入 00001 1000 0312
20170101 103102 0312003 证券买入 00002 500 0312
20170101 133102 0312003 证券卖出 00003 800 0312
......
20171231 143102 0320004 期权买入 00004 500 0320
客户信息表info_t:
机构编号Org_no 机构名称Org_name
0312 黄埔东路
0320 农林下路
...
0306 中年广场
需求1:
请写一段筒单的sql,提取出201712月每个部门每天各种交易类型的交易量给业务部门.
展示字段为:日期、机构名称、证券买入当日交易量、证券卖出当日交易量
分析:
1.用Where语句首先判断日期是否等于201712月
2.然后观察字段内容得知,涉及两张表,需要关联,用Inner Join
SELECT d.busi_date AS 日期,
i.org_name AS 机构名称,
SUM(CASE WHEN d.exch_type='证券买入' THEN d.del_amt END) AS 证券买入当日交易量,
SUM(CASE WHEN d.exch_type='证券卖出' THEN d.del_amt END) AS 证券卖出当日交易量
FROM deli_t d
JOIN info_t i
ON d.org_no=i.org_no
WHERE SUBSTR(d.busi_date,1,6)='201712' -- d.busi_date 为字符串类型
GROUP BY d.busi_date,i.org_name;
需求2:
提取出201712月每天第一个下单的客户、最后一个下单的时间信息.
展示字段为:日期、第一个下单时间、第一个下单客户、最后下单时间、最后下单客户
分析:
- 用Where语句首先判断日期是否等于201712月。
- 第一个和最后一个,可以用聚合函数Min和Max对时间求值
- 第一次关联第一个下单的信息,第二次关联最后一此下单的。
- 涉及两张表的字段,两表做关联,Inner Join。
SELECT tmp.busi_date AS 日期,
d1.exch_time AS 第一个下单时间,
d1.cust_piy_no AS 第一个下单客户,
d2.exch_time AS 最后下单时间,
d2.cust_piy_no AS 最后下单客户
FROM (
SELECT d.busi_date,
MIN(exch_time) AS min_exch_time,
MAX(exch_time) AS max_exch_time
FROM deli_t d
WHERE SUBSTR(d.busi_date,1,6)='201712' -- d.busi_date 为字符串类型
GROUP BY d.busi_date
) tmp
JOIN deli_t d1
ON d1.busi_date=tmp.busi_date
AND d1.exch_time=tmp.min_exch_time
JOIN deli_t d2
ON d2.busi_date=tmp.busi_date
AND d2.exch_time=tmp.max_exch_time
ORDER BY tmp.busi_date;
需求3:
提取出201712月每天成交量前10的产品信息展示字段为:日期、产品代交易量、排名
分析:
1.用Where判断日期等于201712月
2.成交量前十,首先按照成交量大小排序,用分析函数。
3.套用子查询,直接返回小于10的所有信息。
WITH T AS (
SELECT BUSI_DATE, PRD_NO, SUM(DEL_AMT) AS DEL_AMT
FROM DELI_T D
WHERE SUBSTR(D.BUSI_DATE, 1, 6) = '201712'
GROUP BY BUSI_DATE, PRD_NO
)
SELECT * FROM (SELECT T.*,
ROW_NUMBER() OVER(PARTITION BY BUSI_DATE, PRD_NO ORDER BY DEL_AMT DESC) AS RN
FROM T) T1
WHERE T1.RN <= 10;