最近遇到一个这样的问题,有如下一个表:
ID item_name price sell_id buy_id date
1 MP3 100 11 12 2015-8-12
2 apple 12 7 11 2015-8-20
3 mp3 95 3 14 2015-7-14
4 风扇 25 1 7 2015-4-6
5 Apple 25 2 8 2015-7-25
6 cup 8 34 14 2015-8-11
要求:
(1)写一个Sql完成列出每个商品的平均价钱。
(2)列出平均价钱最高的前3个商品。
其实本来并不太难,如下的Sql就能完成:
(1)select item_name,avg(price) from test.goods group by item_name;
(2)select item_name,avg(price) as avpri from test.goods group by item_name order by avg(price) Desc limit 3;
但是当我被问到以下几个问题的时候,就迷惑了:
(1)第一个SQL语句能不能把MP3和mp3当成一个商品,会不会区分大小写?
(2)第二个SQL中order by后面的avg(price)会出错应该怎么处理?
当时一个子就晕了,是不是应该加个不区分大小写的操作,可是应该是什么呢?没有想到。如果order by 后面不能跟avg()函数,应该怎么办呢?
我是比较喜欢挑战的,虽然我可能一时想不起来,不过后来还是会想尽办法,找到答案的。后来经常亲自尝试,发现被忽悠了。Sql本来就不区分大小写的,而且order by后面是可以跟函数的,而且还可以用下面的方法,看起来好像比直接跟函数的好:
select item_name,avg(price) as avpri from test.goods group by item_name order by avpri Desc limit 3;
是我自己学艺不精,不能怪人家的。
现在讨论第二个问题:
如果上面的这个不是数据库,是文件,如何输出每件商量的平时值,以及如何输出平均值最高的前3个商品?
思路分析:
(1)读取文件,将每一行中的数据读取出来,并拆分出每个字段。
(2)以商品名为key,统计出每种商品的总价钱以及每种商品数
(3)求出每种商品的平时价钱
(4)对商品按价钱排序,降序排列
(5)输出前三种商品的商品名和平均价钱。
思路清晰,不过有些儿细节上的问题还是没有考虑到,经过调试和修改,最终的脚本如下:
1, 数据文件GoodsMessge.txt文件,内容同上面的数据库。
2, 脚本文件,内容如下:
1, #!/usr/bin/env python
2, # -*- coding: utf_8 -*-
3, class readfile:
4, '''
5, 分析数据文件
6, '''
7, def checkfile(self):
8, sum1={}
9, cut1={}
10, ave={}
11, file1=open("GoodsMessage.txt")
12, for line in file1.readlines():
13, key=line.split()
14, #按分类统计总金额和商品个数
15, if key[2].isdigit():
16, if sum1.has_key(key[1].lower()):
17, sum1[key[1].lower()]=sum1[key[1].lower()]+float(key[2])
18, cut1[key[1].lower()]=cut1[key[1].lower()]+1
19, else:
20, sum1[key[1].lower()]=float(key[2])
21, cut1[key[1].lower()]=1
22,
23, for key in sum1.keys():
24, ave[key]=sum1[key]/cut1[key]
25, #print key,ave[key]
26, #平均值排序
27, ave1=sorted(ave.iteritems(),key=lambda a:a[1],reverse=True)
28, #print ave1
29, for i in range(0,3):
30, print "商品名:",ave1[i][0],"平均价格:",ave1[i][1]
31,
32, rf=readfile()
33, rf.checkfile()
34,
先按商品名对商品的价钱进行统计,并且统计商品的个数;如果这个商品没有统计过,就将相应的key对应的Value置为这个数,如果有统计,就相加。代码对应15-21行,标题这一行不予统计。
然后算出每件商品的平均价格,23-24行存放到字典ave中。对ave中按平均价格进行排序,降序存放到ave1中,此是的ave1是一个list类型的。
循环输出前三个商量的商品名和平均价格,达到要求。当我的思路明确后,我对求平均值和排序这些儿细节性的东西,没有想到具体的解决办法。这说明大的方向我学的还是可以的,小到细节,或是更加深入的方面,没有学到家。明白了自己的缺点,以后得好好深入学习。不过我个人认为,思路才是最重要的,你可以不会细节,但一定要有解决问题的办法。然后借助于网络,通过自己的尝试,总能找到具体的解决方案的。