mysql中有一个表tt,有三个字段——商品,日期,销量
如何用mysql搜索所有商品史上最大销量发生的日期,以及指定日期(例如2016-01-22)的销量及其与最大销量的比例,搜索出来大概是这个样子商品1 最大销量发生的日期 最大销量 2016-01-22 2016-01-22的销量 2016-01-22的销量/最大销量
商品2 最大销量发生的日期 最大销量 2016-01-22 2016-01-22的销量 2016-01-22的销量/最大销量
商品3 最大销量发生的日期 最大销量 2016-01-22 2016-01-22的销量 2016-01-22的销量/最大销量
商品4 最大销量发生的日期 最大销量 2016-01-22 2016-01-22的销量 2016-01-22的销量/最大销量
商品5 最大销量发生的日期 最大销量 2016-01-22 2016-01-22的销量 2016-01-22的销量/最大销量
……
有多少品种就列出多少品种其中 2016-01-22 是搜索时指定的猕猴桃 2015-01-02 1000 2016-01-22 888 0.888
苹果    2015-09-12 500 2016-01-22  300 0.600
西葫芦 2015-07-02 400 2016-01-22 300 0.750
芦柑    2016-01-22 200 2016-01-22 200 1.000谢谢了

解决方案 »

  1.   


    SELECT t1.商品, t1.日期 AS 最大销量发生的日期, t2.销量 AS 最大销量, 
           t2.日期 AS 指定日期, t2.销量 AS 指定日期最大销量, t2.销量/t1.销量 AS 比例 FROM 
    (SELECT 商品, MAX(销量) AS 销量 FROM tt GROUP BY 商品) AS t2
    INNER JOIN tt AS t1
    ON t1.商品 = t2.商品 AND t1.销量 =t2.销量 
    INNER JOIN
    (SELECT 商品, 日期, MAX(销量) AS 销量 FROM tt 
       WHERE DATE_FORMAT(日期, '%Y-%m-%d') = '2016-01-22' 
       GROUP BY 商品) AS t3
    ON t1.商品 = t3.商品
      

  2.   


    SELECT t1.商品, t1.日期 AS 最大销量发生的日期, t2.销量 AS 最大销量, 
           t2.日期 AS 指定日期, t2.销量 AS 指定日期最大销量, CONVERT((1.000*t2.销量/t1.销量), DECIMAL(18, 3)) AS 比例 FROM 
    (SELECT 商品, MAX(销量) AS 销量 FROM tt GROUP BY 商品) AS t2
    INNER JOIN tt AS t1
    ON t1.商品 = t2.商品 AND t1.销量 =t2.销量 
    INNER JOIN
    (SELECT 商品, 日期, MAX(销量) AS 销量 FROM tt 
       WHERE DATE_FORMAT(日期, '%Y-%m-%d') = '2016-01-22' 
       GROUP BY 商品) AS t3
    ON t1.商品 = t3.商品
      

  3.   

    drop table if exists tt;
    create table tt(product varchar(30) comment '商品名称',sale_date date comment '销售日期',amount int comment '销量') ;
    insert into tt values
    ('猕猴桃','2016-01-01',100),('猕猴桃','2016-01-02',110),('猕猴桃','2016-01-03',120),('猕猴桃','2016-01-04',130),
    ('苹果','2016-01-01',200),('苹果','2016-01-02',120),('苹果','2016-01-03',320),('苹果','2016-01-04',430),
    ('西葫芦','2016-01-01',300),('西葫芦','2016-01-02',310),('西葫芦','2016-01-03',150),('西葫芦','2016-01-04',400),
    ('芦柑','2016-01-01',400),('芦柑','2016-01-02',140),('芦柑','2016-01-03',520),('芦柑','2016-01-04',160);-- 写法1
    -- 改写法的缺陷:如果有相同的多条最高销售额记录,结果会有多条
    create index idx_tt_pd on tt(product desc,amount desc);
    create index idx_tt_sd on tt(sale_date);select t4.product,t3.max_sdate,t3.max_amount,t4.sale_date,t4.amount,round(t4.amount*1.00/t3.max_amount,3) as rate
    from 
    (select t2.product,t2.sale_date as max_sdate,t2.amount max_amount from 
    (select product,max(amount) amount from tt group by product) t1,tt t2
    where t1.product=t2.product and t1.amount=t2.amount) t3 inner join  tt t4
    on t3.product=t4.product
    where t4.sale_date=str_to_date('2016-01-03', '%Y-%m-%d');-- 写法2
    -- 改写法类似oracle的分析函数rank,不存在多条相同最高销售额的问题
    create index idx_tt_pad on tt(product desc,amount desc,sale_date);select t4.product,t3.sale_date as max_sdate,t3.amount as max_amount,t4.sale_date,
    t4.amount,round(t4.amount*1.00/t3.amount,3) as rate
    from 
    (select t1.product,t1.sale_date,t1.amount,if(@p<>t1.product,@r:=1,@r:=@r+1) as r,@p:=t1.product as p
    from 
    (select product,sale_date,amount from tt order by product desc,amount desc) t1,(select @p:='',@r:=0) t2) t3
    inner join tt t4 
    on t3.product=t4.product
    where t4.sale_date=str_to_date('2016-01-03', '%Y-%m-%d')
    and t3.r=1;
      

  4.   

    select 商品,日期,销量
    (select 日期 from 表tt where 商品=t.商品 order by 销量 desc limit 1) as 最大销量发生的日期,
    (select 销量 from 表tt where 商品=t.商品 order by 销量 desc limit 1) as 最大销量
    from 表tt a
    where 日期='2016-01-22'