使用与SQL Server相同的表减去总计

时间:2012-08-12 19:15:26

标签: sql sql-server-2008

我在SQL Server 2008数据库中有一个付款表,它包含付款金额和贷记金额,信用额由字段txt_pay_type标识,等于“信用”。

我正在尝试输出一些报告,一个是每个网站的总收入。

我使用这个select语句来获取每个网站的总和和平均值,我怎样才能获得它来取消信用额度。

所以最终的webTotal更少并且信用。

我做了所有不是信用的付款的总和(如下所示),为所有付款做一笔金额,然后从另一笔付款。或者我最好在冷融合页面上这样做?

E.g网站1支付总额5000,信用额度1000。结果将是;

Website    Total Revenue  Average Sale   
Website 1  4000           200.00


SELECT 
  txt_web_name,
  SUM(mon_pay_amount) AS webTotal,
  AVG(mon_pay_amount) AS webAvg
FROM
  tbl_payment
  INNER JOIN dbo.tbl_orders ON (uid_pay_orderid = uid_orders)
  INNER JOIN dbo.tbl_websites ON (uid_order_webid = uid_websites)
WHERE
  dbo.tbl_payment.bit_pay_paid = <cfqueryparam cfsqltype="cf_sql_bit" value="yes">
  AND txt_pay_status <> <cfqueryparam cfsqltype="cf_sql_varchar" value="Credit">
GROUP BY
  txt_web_name

任何指针都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

您需要一个条件总和:

SELECT txt_web_name, SUM(mon_pay_amount) AS webTotal, AVG(mon_pay_amount) AS webAvg,
       sum(case when txt_pay_type <> 'Credit' then mon_pay_amount else 0 end
          ) as TotalNoCredit,
       avg(case when txt_pay_type <> 'Credit' then mon_pay_amount end
          ) as AvgNoCredit
FROM tbl_payment
     INNER JOIN dbo.tbl_orders ON (uid_pay_orderid = uid_orders)
     INNER JOIN dbo.tbl_websites ON (uid_order_webid = uid_websites)
WHERE dbo.tbl_payment.bit_pay_paid = <cfqueryparam cfsqltype="cf_sql_bit" value="yes">
      AND txt_pay_status <> <cfqueryparam cfsqltype="cf_sql_varchar" value="Credit">
GROUP BY txt_web_name

注意总和,我默认为0,所以一个月内没有值会导致$ 0。对于平均值,我默认为NULL,因此信用值不会以平均值计算。

答案 1 :(得分:1)

您可以使用CASE语句来决定是添加还是减去mon_pay_amount,例如

SELECT
    txt_web_name,
    SUM(CASE 
        WHEN txt_pay_type = 'credit' 
        THEN -1 * mon_pay_amount 
        ELSE mon_pay_amount END) AS webTotal,
...

答案 2 :(得分:1)

不清楚确切的列是什么,但像这样的东西将成为冠军:

SUM(CASE txt_pay_type = 'credit' 
    THEN mon_pay_amount 
    ELSE (-1*mon_pay_amount) END) AS webTotal,