• 学习要深入


     最近遇到一个这样的问题,有如下一个表:

    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就能完成:

    1select item_name,avg(price) from test.goods group by item_name;

    2select item_name,avg(price) as avpri from test.goods group by item_name order by avg(price)  Desc limit 3;

    但是当我被问到以下几个问题的时候,就迷惑了:

    (1)第一个SQL语句能不能把MP3mp3当成一个商品,会不会区分大小写?

    (2)第二个SQLorder 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类型的。

    循环输出前三个商量的商品名和平均价格,达到要求。当我的思路明确后,我对求平均值和排序这些儿细节性的东西,没有想到具体的解决办法。这说明大的方向我学的还是可以的,小到细节,或是更加深入的方面,没有学到家。明白了自己的缺点,以后得好好深入学习。不过我个人认为,思路才是最重要的,你可以不会细节,但一定要有解决问题的办法。然后借助于网络,通过自己的尝试,总能找到具体的解决方案的。

  • 相关阅读:
    nginx.conf
    添加分类和标签,级联数据
    使用事物插入数据库
    列表页面常用技巧
    常用TagHelper
    培训指导
    控件数据绑定总结
    快速添加Basic表单
    自动构建表单
    模块制作标准说明
  • 原文地址:https://www.cnblogs.com/eagleking0318/p/6520781.html
Copyright © 2020-2023  润新知