一个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)