0906练习题

2020-09-06  本文已影响0人  元宝2020

SQL部分

1、求拥有2辆及以上车的人每辆车的购车金额占个人总购车金额的比重
建表 CREATE TABLE car ( userid int, carid varchar(10), price decimal(6, 2), date date

答案:

select car.userid,carid,concat(round(price/sum_price*100,2),"%") as '占比'
from
car 
inner join
(SELECT userid, SUM(price) AS sum_price, COUNT(userid) AS cons
        FROM car
        GROUP BY userid) t
on car.userid=t.userid
where t.cons>=2
order by car.userid

这道题一开始想的太简单了,想着把ID分组后,筛选出记录大于等于2条的id,然后用相应的金额除以总计求和就OK了。

但是执行下来求出的是每个ID的购车金额占全部price字段占比,不满足要求;加上carid之后,发现对ID+carid分组,然后求金额占比都是100%。。。

整体了一下思路,先求了每个ID的总计购车金额,已经拥有车辆数量,将这个表作为临时表。然后和原表内连接,再去限定车辆数量,求一个每个ID的内部购车金额占比。
终于OK了

2、求年累加值,总累加值
建表 CREATE TABLE temp ( DATE DATETIME, VALUE INT );

答案:

select b.year,b.month,
    @year_sum := IF(@year = YEAR, @year_sum + VALUE1, VALUE1) AS YSUM, 
    @year := YEAR,
    @cum_sum := @cum_sum + value1 AS cumsum
from 
(select 
       year(date) as YEAR,
       month(date) as MONTH,
        sum(value) as value1
from temp 
group by year(date),month(date)
)b,(SELECT @YEAR:= 0,@year_sum:= 0,@cum_sum:= 0) a

cumsum为null 不知道哪里有问题。。。
ps:已经订正,赋值要用:=,就可以跑通了

3、列转行
建表 CREATE TABLE st_score ( userid varchar(20) NOT NULL COMMENT '用户ID', subject varchar(20) COMMENT '科目', score int(4) COMMENT '成绩' )

答案:

select userid,
          case when subject = "语文" then score else 0 end as '语文 ',
          case when subject = "数学"  then score else 0 end as '数学 ',
          case when subject = "英语" then score else 0 end as '英语 ',
          case when subject = "政治" then score else 0 end as '政治 '
from st_score

4、行转列
建表 CREATE TABLE st_score1 ( userid VARCHAR ( 20 ) NOT NULL COMMENT '用户id',
cn_score DOUBLE COMMENT '语文成绩', math_score DOUBLE COMMENT '数学成绩', en_score DOUBLE COMMENT '英语成绩', po_score DOUBLE COMMENT '政治成绩' )

答案:

select userid, '语文' COURSE , CN_SCORE as SCORE from st_score1  
union 
select userid, '数学' COURSE, MATH_SCORE as SCORE from st_score1   
union 
select userid, '英语' COURSE, EN_SCORE as SCORE from st_score1   
union
select userid, '政治' COURSE, PO_SCORE as SCORE from st_score1   
order by  course desc,userid

5、计算各院系的男女计数以及合计
建表 CREATE TABLE st ( id VARCHAR(20), NAME VARCHAR(20), gender CHAR(1), birth VARCHAR(20), department VARCHAR(20), address VARCHAR(20) )

答案

select department,
          sum(case  when gender='男' then 1 else 0 end ) as '男',
          sum(case  when gender='女' then 1 else 0 end ) as '女',
          count(*) as '合计'
from st
group by department

Python部分

1、什么是PEP8规范?

PEP(Python Enhancement Proposals) 文档中的第八篇专门针对 Python 的代码格式 给出了建议,也就是俗称的 PEP 8,规定了如缩进、换行、空格、注释等代码格式
https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/

2、Python都有那些自带的数据结构?

列表,元组,字典,集合

共同点:都是可迭代对象

不同点:列表,字典是可变的
元组,集合不可变

3、Python中的负索引是什么?

Python中的序列是可以采用负数的索引来访问的,其范围是 -1 到序列的负长度,也就是负索引以序列的结束为起点。
list[2,3,4,5,68,0]
list[-1]=0

4、怎么对列表进行去重操作?
list1=[2,1,2,4,5,6,10,3,3,3,7]

pd.unique(list1)
array([ 2, 1, 4, 5, 6, 10, 3, 7])

5、pandas的axis参数怎么理解?
axis是轴,传入axis参数可以指定在哪个轴上操作,用于获取列表的行和列

  1. axis=0 或者 "index":
    如果是单行操作,就指的是某一行
    如果是聚合操作,指的是跨行cross rows

  2. axis=1 或者"columns"
    如果是单列操作,就指的是某一列
    如果是聚合操作,指的是跨列cross columns

官方解释axes.png
image.png
上一篇下一篇

猜你喜欢

热点阅读