2013-04-05 117 views
0

我在SQL Server數據庫中2005年工作:SUM函數沒有正確

enter image description here

我的查詢是:

SELECT * 
FROM TRADEFILE 
WHERE CONVERT(DATETIME,SAUDA_DATE) LIKE 'MAR 1 2013%' 
    AND SCRIP_CODE='DLF' AND INST_TYPE LIKE 'FUT%' 

這給我造成:

enter image description here

在這個買入= 1和賣出= 2。

如果我們做的和購買數量即buy_sell = 1,那麼它是3000

,當我們爲賣出交易數量即buy_sell總和= 2那麼3000

但是當我火了此查詢爲獲得相同的結果如下:

select 
    CONVERT(VARCHAR(11),sauda_date) AS sauda_date, 
    SUM(CASE 
     WHEN Buy_sell = 1 and scrip_code='DLF' 
      and Sauda_Date between convert(datetime,'01/03/2013') 
      and convert(datetime,'06/04/2013') 
     THEN Trade_Qty ELSE 0 END) AS BuyQty, 
    SUM(CASE 
     WHEN Buy_sell = 2 and scrip_code='DLF' 
      and Sauda_Date between convert(datetime,'01/03/2013') 
      and convert(datetime,'06/04/2013') 
     THEN Trade_Qty ELSE 0 END) AS SellQty ,  
    SUM(CASE 
     WHEN Buy_sell = 1 and scrip_code='DLF' 
     THEN Trade_Qty ELSE 0 END) 
     -SUM(CASE 
      WHEN Buy_sell = 2 and scrip_code='DLF' 
      THEN Trade_Qty ELSE 0 END) AS CarryForword 
from tradefile 
where scrip_code='DLF' 
group by CONVERT(VARCHAR(11),sauda_date) 

它給我結果爲:

enter image description here

即BuyQty = 5000且sellQty是4000 ,而我們已經分別計算了它們的3000和3000。

它怎麼會有所不同?是我sum()函數工作錯了?

我的查詢是錯誤的嗎?

+0

作爲一個側面說明你正在使用'scrip_code =」 DLF'在每個CASE的WHERE和裏面,你可以在WHERE子句中使用它並從每個CASE中刪除它,這將簡化你的代碼。 – Taryn 2013-04-05 11:19:26

回答

3

條件有很大不同,所以結果也是合理的。

例子:

  1. 在第一個查詢,你有PARTY_CODE的條件。這在第二個查詢中完全缺失。
  2. INST_TYPE
  3. SAUDA_DATE的條件有很大不同。第一個查詢僅查詢3月1日,而第二個查詢查詢3月1日至4月6日之間的所有內容。
+0

不,所有記錄只用於同一方的代碼,沒有問題的黨代碼,我剛剛檢查 – Freelancer 2013-04-05 11:19:55

+0

@Freelancer:這仍然留下其他問題。 – 2013-04-05 11:26:36

+0

明白了,INST_TYPE wad問題。thanx – Freelancer 2013-04-05 11:27:00

1

我知道您給出的第一個查詢,對於buyin_qty和sell_qty有3000個查詢。

其中有CASE語句的第二個查詢錯過一些你在那裏的條件從第一個查詢

AND PARTY_CODE='0L036' 
AND INST_TYPE LIKE 'FUT%' 
+0

INST_TYPE LIKE'FUT%'是問題,thanx – Freelancer 2013-04-05 11:29:59

1

這應該工作:

select 
    CONVERT(VARCHAR(11),sauda_date) AS sauda_date, 
    SUM(CASE WHEN Buy_sell = 1 THEN Trade_Qty ELSE 0 END) AS BuyQty, 
    SUM(CASE WHEN Buy_sell = 2 THEN Trade_Qty ELSE 0 END) AS SellQty ,  
    SUM(CASE WHEN Buy_sell = 1 THEN Trade_Qty ELSE 0 END) 
    -SUM(CASE WHEN Buy_sell = 2 THEN Trade_Qty ELSE 0 END) AS CarryForword 
from tradefile 
where scrip_code='DLF' 
group by CONVERT(VARCHAR(11),sauda_date) 
+0

INST_TYPE LIKE'FUT%'是問題,thanx爲我付出努力。 – Freelancer 2013-04-06 04:28:04