现句语如下,得到的效果如上图所示。
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)不一样,导致出现了三次,请问怎样改以上句子才能让不同进价的同一个商品也集合在一起?即只出现一次。

解决方案 »

  1.   

    这个应该不是语句的问题了,是业务逻辑问题啊,你想让不同的三个进价以何种方式来参与运算呢,你所谓的集合是平均,还是怎样?
    如果可以将三个不同进价平均的话,可以将这个表先做一次聚合,取得avg(jj)然后在做关联
      

  2.   

    --如果使用平均价行不?
    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)
                                                        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
    ORDER BY bm