首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2013-02-19 
一个SQL语句的问题,关于SUM现句语如下,得到的效果如上图所示。SELECT sd.bm,spzl.tm,spzl.pm,spzl.lbid,lbz

一个SQL语句的问题,关于SUM
一个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)
                                                    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

热点排行