【问题标题】:sum function not working properlysum 函数无法正常工作
【发布时间】:2013-03-27 18:43:21
【问题描述】:

我在 SQL Server 2005 中的数据库:

我的查询是:

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

这给了我结果:

在此 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)

它给我的结果是:

即BuyQty=5000 和 sellQty 是 4000 而我们分别计算为 3000 和 3000。

有什么不同呢?我的 sum() 函数工作错了吗??

我的查询有误吗?

【问题讨论】:

  • 附带说明,您在 WHERE 和每个 CASE 中使用 scrip_code='DLF',您可以在 WHERE 子句中使用它并从每个 CASE 中删除它,这将简化您的代码。跨度>

标签: sql database sql-server-2005 join


【解决方案1】:

条件完全不同,因此结果也是合理的。

例子:

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

【讨论】:

  • 没有,所有记录都是同一方代码,没有方代码问题,我刚刚检查过
  • @Freelancer:还有其他问题。
  • 知道了,INST_TYPE wad 问题。谢谢
【解决方案2】:

我了解您给出的第一个查询,buyin_qty 和 sell_qty 有 3000。

在您的第二个查询中,有 CASE 语句错过了第一个查询中的一些 where 条件

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

【讨论】:

  • INST_TYPE LIKE 'FUT%' 是个问题,谢谢
【解决方案3】:

这应该可行:

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)

【讨论】:

  • INST_TYPE LIKE 'FUT%' 是个问题,感谢您为我付出的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2012-08-15
  • 2013-11-05
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多