日期:2014-05-17  浏览次数:20698 次

一个SQL语句的问题,关于SUM

现句语如下,得到的效果如上图所示。
SELECT sd.bm,spzl.tm,spzl.pm,spzl.lbid,lbzl.lbname,spzl.dw,
   sum(sd.sl) AS sl,
   sum(sd.sl) * sd.jj AS jjtot,
   SUM(sd.sjxj) sjtot,
   SUM(sd.sjxj) - sum(sl) * sd.jj AS lrtot, 
   (SUM(sd.sjxj) - sum(sl) * sd.jj) / (CASE SUM(sd.sjxj) WHEN 0 THEN 0.01 ELSE SUM(sd.sjxj) END) AS lrl 
   FROM saledetail sd 
   LEFT OUTER JOIN spzl ON sd.bm = spzl.bm 
   LEFT OUTER JOIN lbzl ON lbzl.lbid = spzl.lbid 
   LEFT OUTER join salemaster sm ON sd.dh = sm.dh 
   left outer join colors c on c.id=sd.colorid 
   left outer join size_detail on size_detail.id = sd.sizeid 
   WHERE (sm.js = 1 ) AND ((sm.xsdate >= '2013-1-1' AND sm.xsdate <= '2013-2-3')) 
and sm.ckid='01'
GROUP BY sd.bm,spzl.tm,spzl.pm,spzl.dw,spzl.lbid,lbzl.lbname,sd.jj
order by bm

问题在于红线圈中的三条记录,由于进货价(字段名为:JJ)不一样,导致出现了三次,请问怎样改以上句子才能让不同进价的同一个商品也集合在一起?即只出现一次。

------解决方案--------------------
这个应该不是语句的问题了,是业务逻辑问题啊,你想让不同的三个进价以何种方式来参与运算呢,你所谓的集合是平均,还是怎样?
如果可以将三个不同进价平均的话,可以将这个表先做一次聚合,取得avg(jj)然后在做关联
------解决方案--------------------
--如果使用平均价行不?
SELECT  sd.bm ,
        spzl.tm ,
        spzl.pm ,
        spzl.lbid ,
        lbzl.lbname ,
        spzl.dw ,
        SUM(sd.sl) AS sl ,
        SUM(sd.sl) * AVG(sd.jj) AS jjtot ,
        SUM(sd.sjxj) sjtot ,
        SUM(sd.sjxj) - SUM(sl) * AVG(sd.jj) AS lrtot ,
        ( SUM(sd.sjxj) - SUM(sl) * AVG(sd.jj) ) / ( CASE SUM(sd.sjxj)
                                                      WHEN 0 THEN 0.01
                                                      ELSE SUM(sd.sjxj)