我在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
任何指针都会受到赞赏。
答案 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,