表A:
ID 编号 面值 销售价格 销售数量 销售总额
1 YK-001 50 45 2 90
2 YK-002 10 8 1 8 表B:
ID 编号 面值 销售数量 进价
8 YK-001 50 1 40
9 YK-001 50 1 40
10 YK-002 10 1 5表A一条数据可能对应表B多条。现在需要根据表A去表B查询出每个订单的总进价。也就是说编号YK-001的查询出来总进价就是80.YK-002总进价是5.
 希望得到的结果集是:
总交易数 总面值 总销售总额 总利润(总销售价格 - 总进价)
2 110 98 13PS:我知道有很多解决方案,比如做个统计表,每天定时或触发统计。或者写个存储过程好解决。
但现在的情况是希望在程序端发送一次SQL查询请求就能完成这样的统计。
不然程序端只能先查询出表A所有的数据,然后再遍历这些数据,再去表B查询,然后再做处理,不是很好的解决方案。不知大家有没有好的办法,望指点。

解决方案 »

  1.   


    select count(*) as 总交易数 ,sum(a.销售总额) as 总销售总额 , sum(a.面值*a.销售数量) as 总面值,sum(a.销售总额)-(select sum(销售数量*进价) from tb)  as 总利润 from ta a 
      

  2.   

    顺便请问下,MySQL 支持 WITH AS吗?
      

  3.   

    select count(*) as 总交易数,sum(面值*销售数量) as 总面值,sum(销售价格*销售数量),销售总额-(select sum(进价*销售数量) from tb where A.编号=编号) 
    from A
      

  4.   

    根据A查询  就加where条件
      

  5.   


    select a.编号,sum(a.销售总额) as 总销售总额 , sum(a.面值*a.销售数量) as 总面值 ,max(c.总交易数),max(b.ss)
    from (ta a left join (select 编号,sum(销售数量*进价) as ss  from tb  group by 编号) b
    on a.编号=b.编号)
    left join
    (select 编号,count(*) as 总交易数 from (select distinct 编号 from tb ) group by 编号) c
    on a.编号=c.编号
    group by a.编号
      

  6.   

    再补充下:
    这里存在拆单的情况,也就是说表A一条数据(一个订单)对应表B多条数据(多个供货商提供,每个进价可能不一样,且销售数量不一样)。
    如果我要查询表A 2012-05-01到2012-08-08的数据,然后再去表B根据编号取总进价,因为可能存在多个供货商,且进价和销售数量不一样,所以卡在这里了:(
      

  7.   

    select a.编号,sum(a.销售总额) as 总销售总额 , sum(a.面值*a.销售数量) as 总面值 ,max(c.总交易数),max(b.ss)
     from (ta a left join (select 编号,sum(销售数量*进价) as ss  from tb  group by 编号) b
     on a.编号=b.编号)
     left join
     (select 编号,count(*) as 总交易数 from (select distinct 编号 from tb ) d group by 编号) c
     on a.编号=c.编号
     group by a.编号 此处需要别名,谢谢@wwwwb 斑竹 鼎力相助,解我燃眉之急,这样的写法学习了:)希望也能帮助到其他有这样特殊需求的朋友:)
      

  8.   

     select count(a.编号),sum(a.销售总额) as 总销售总额 , sum(a.面值*a.销售数量) as 总面值 ,max(b.ss)
      from (ta a left join (select 编号,sum(销售数量*进价) as ss  from tb  group by 编号) b
      on a.编号=b.编号)
     where a.时间 = '时间' and a.用户 = '用户'
      group by a.编号 在@wwwwb 斑竹的基础上我的调整基本就这样,因为表A一条数据就是一笔交易,不必去统计表B每个单子下的所有供货商,所以我去掉了left join c。