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

负数变正数和多个选择列汇总计算平均数的疑问

SELECT 出库总表.店面编号 店面编号,
       出库明细表.商品编号 商品编号,
       SUM(CASE 结算方式 WHEN '现金' THEN 出库明细表.现金结算量 END) AS 现金结算量,
       SUM(CASE 结算方式 WHEN '现金' THEN 出库明细表.现金金额 END) AS 现金金额,
       SUM(CASE 结算方式 WHEN '签卡' THEN 出库明细表.签卡量 END) AS 欠款量,
       SUM(CASE 结算方式 WHEN '签卡' THEN 出库明细表.签卡单价 * 出库明细表.签卡量 END) AS 欠款金额,
       SUM(CASE 结算方式 WHEN '签卡' THEN 出库明细表.赠送量 END) AS 赠送量,
       (现金金额+欠款金额)/(现金结算量+欠款量+赠送量) AS 平均单价 --太长,只体现一下意思
FROM  出库总表,出库明细表
WHERE 出库总表.出库单序号 = 出库明细表.出库单序号 AND
      出库总表.是否冲销 = 0 AND
      出库总表.店面编号 = 1 AND
      (出库明细表.商品编号 = 1 OR 出库明细表.商品编号 = 2) AND
      (出库总表.出库日期 BETWEEN '2012-1-1 0:00:00' AND '2012-12-31 23:59:59')
GROUP BY 出库总表.店面编号,
         出库明细表.商品编号 

当有两种以上商品时,想统计一下每种商品的平均单价:平均单价=(现金金额+欠款金额)/(现金量+欠款量+赠送量)。其中欠款金额是通过签卡单价乘签卡量得到的。有两个问题:
1.签卡量可能出现负数。如何使当签卡量是负数时先把它变成正数再计算,确保欠款量和欠款金额都输出正数,以进一步保证平均单价的正确性。
2.平均单价的计算,我的语句在结果集中只计算了第一行,剩下的行都是NULL,如何才能让它对每行都计算(即对每种商品都计算)。
最后的38分了,呵呵.

------解决方案--------------------
1.签卡量: ABS(签卡量) 取绝对值.
2.其他值都是null不是因为计算的问题,而是在计算中有列的值为null,所以结果直接就是null了,这个要你自己每个列都看一下,是不是有真正的值.

------解决方案--------------------
1.abs(签卡量)
2.isnull(字段,0)