0906练习题
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参数可以指定在哪个轴上操作,用于获取列表的行和列
-
axis=0 或者 "index":
如果是单行操作,就指的是某一行
如果是聚合操作,指的是跨行cross rows -
axis=1 或者"columns"
如果是单列操作,就指的是某一列
如果是聚合操作,指的是跨列cross columns
image.png