0

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

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

我正在使用这个选择语句来获取每个网站的总和和平均值,我怎样才能让它带走信用额。

所以最终的 webTotal 是少和学分。

即对所有非信用的付款进行总和(如下所示),对所有作为信用的付款进行总和,然后从另一个中取一个。或者我最好在冷聚变页面上执行此操作?

例如,网站 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

任何指针将不胜感激。

4

3 回答 3

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,因此不会在平均值中计算信用值。

于 2012-08-12T19:20:12.630 回答
1

您可以使用CASE语句来决定是添加还是减去 a 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,
...
于 2012-08-12T19:20:42.550 回答
1

不清楚这些列到底是什么,但这样的东西会起作用:

SUM(CASE txt_pay_type = 'credit' 
    THEN mon_pay_amount 
    ELSE (-1*mon_pay_amount) END) AS webTotal,
于 2012-08-12T19:21:00.197 回答