2012-08-12 32 views
0

我在SQL Server 2008數據庫中有一個支付表,它包含支付金額和貸方金額,貸方由字段txt_pay_type確定,這將等於'貸記'。使用與SQL Server相同的表減去總計

我想輸出一些報告,一個是每個網站的總收入。

我正在使用這個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 

任何指針,將不勝感激。

回答

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,所以信用值不會在平均值中計算。

+0

謝謝,所有的解決方案都是正確的,並且運作良好。我已經標記戈登林諾是正確的,如第一回答。並標記其餘的。謝謝 – 2012-08-12 20:09:56

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, 
... 
+0

謝謝,所有的解決方案都是正確的,並且運行良好。我已經標記戈登林諾是正確的,如第一回答。並標記其餘的。謝謝 - – 2012-08-12 20:10:14

1

不清楚究竟有哪些列,但像這樣的工作,一個冠軍:

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