sum函数不能正常工作

时间:2013-04-05 11:12:04

标签: sql database sql-server-2005 join

我在SQL Server 2005中的数据库:

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

在此Buy = 1且Sell = 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()函数工作错误??

我的查询错了吗?

3 个答案:

答案 0 :(得分:3)

条件差异很大,结果也是合理的。

示例:

  1. 在您的第一个查询中,您有PARTY_CODE的条件。第二个查询中完全没有这个。
  2. INST_TYPE
  3. 也是如此
  4. SAUDA_DATE的条件非常不同。第一个查询仅查询3月1日,而第二个查询在3月1日和4月6日之间查询所有内容。

答案 1 :(得分:1)

我了解到您提供的第一个查询,其中有3000个用于buyin_qty和sell_qty。

在你的第二个查询中,CASE语句错过了来自第一个查询的某些条件

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

答案 2 :(得分: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)