【PL/SQL】基础练习 14 (下)

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月每天第一个下单的客户、最后一个下单的时间信息.
展示字段为:日期、第一个下单时间、第一个下单客户、最后下单时间、最后下单客户

分析:

  1. 用Where语句首先判断日期是否等于201712月。
  2. 第一个和最后一个,可以用聚合函数Min和Max对时间求值
  3. 第一次关联第一个下单的信息,第二次关联最后一此下单的。
  4. 涉及两张表的字段,两表做关联,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;      

你可能感兴趣的:(oracle,plsql)