Asp.net SQL SUM()函数始终返回0

Asp.net SQL SUM()函数始终返回0,asp.net,sql,sum,Asp.net,Sql,Sum,我正在使用SQL Server在ASP.NET平台上执行此语句 SELECT id, size, color, SUM(CASE WHEN storeID IN ('E13','E15','E10') THEN stock ELSE 0 END) + SUM(CASE WHEN storeID IN ('E13','E15','E10') THEN incoming ELSE 0 END) - SUM(CASE WHEN storeID IN

我正在使用SQL Server在ASP.NET平台上执行此语句

SELECT id, size, color, 
        SUM(CASE WHEN storeID IN ('E13','E15','E10') THEN stock ELSE 0 END) 
        + SUM(CASE WHEN storeID IN ('E13','E15','E10') THEN incoming ELSE 0 END) 
        - SUM(CASE WHEN storeID IN ('E13','E15','E10') THEN outgoing ELSE 0 END) 
    AS Total 
FROM stocks 
GROUP BY id, size, color
这是我用来检索得到的值的代码

For Each rowStock In TableStocks.Rows
    Dim product As New ProductInfo
    With product
        .id = rowStock("id")
        .size = rowStock("size")
        .color = rowStock("color")
        .stock = rowStock("Total")
    End With
Next
id
size
color
值正确,但
SUM
函数的结果始终为0。如果我在SQL Server管理系统上运行查询,它就可以正常工作

我试过换衣服

.stock = rowStock(3)
而不是

.stock = rowStock("Total")

但我得到了同样的结果。我不知道我遗漏了什么。

我唯一看到的是在“total”后面加了一个逗号,这表示在“from”关键字和choking之前的查询中需要另一个列名

除此之外,我将把你的问题改为

SELECT
      id, size, color, sum( stock + incoming - outgoing ) as Total
   FROM
     stocks 
   where
      storeID IN ('E13','E15','E10')
   GROUP BY 
      id, size, color

我唯一看到的是在“total”后面加了一个逗号,这表示在“from”关键字和choking之前的查询中需要另一个列名

除此之外,我将把你的问题改为

SELECT
      id, size, color, sum( stock + incoming - outgoing ) as Total
   FROM
     stocks 
   where
      storeID IN ('E13','E15','E10')
   GROUP BY 
      id, size, color

最后我找到了解决我自己问题的办法。我已将查询保存到数据库中的存储过程中,它的工作方式与我预期的一样

编辑

我找到了另一个不使用存储过程的解决方案。我意识到在运行sql语句之前,它被转换成小写。所以我决定在
storeID
字段中使用
collateSQL\u Latin1\u General\u CP1\u CI\u AS
,只是想尝试一下。成功了

最后一个SQL查询是

SELECT id, size, color,  
    SUM(CASE WHEN storeID COLLATE SQL_Latin1_General_CP1_CI_AS 
    IN ('E13','E15','E10') THEN stock + incoming - outgoing ELSE 0 END)  
  AS Total 
FROM stocks 
GROUP BY id, size, color

最后我找到了解决我自己问题的办法。我已将查询保存到数据库中的存储过程中,它的工作方式与我预期的一样

编辑

我找到了另一个不使用存储过程的解决方案。我意识到在运行sql语句之前,它被转换成小写。所以我决定在
storeID
字段中使用
collateSQL\u Latin1\u General\u CP1\u CI\u AS
,只是想尝试一下。成功了

最后一个SQL查询是

SELECT id, size, color,  
    SUM(CASE WHEN storeID COLLATE SQL_Latin1_General_CP1_CI_AS 
    IN ('E13','E15','E10') THEN stock + incoming - outgoing ELSE 0 END)  
  AS Total 
FROM stocks 
GROUP BY id, size, color


这三个和分别返回什么?在给定条件下,似乎有些情况返回零,或者这些值是,请分别检查公式中所有值的和。@gbn第一个和返回每个产品的实际库存。第二个,返回向生产商订购的单元数。最后一个返回由于制造原因而发送给生产商的单元数defects@Cpt.Awesome-这是显而易见的,但这不是gbn所要求的。gbn(以及我们所有人现在)想知道你的总和的个别结果。有可能是10、10和20吗?这3个总和分别返回什么?在给定条件下,似乎有些情况返回零,或者这些值是,请分别检查公式中所有值的总和。@gbn第一个总和返回每个产品的实际库存。第二个,返回向生产商订购的单元数。最后一个返回由于制造原因而发送给生产商的单元数defects@Cpt.Awesome-这是显而易见的,但这不是gbn所要求的。gbn(以及我们所有人现在)想知道你的总和的个别结果。它们有可能是10、10和20吗?您的备选查询返回的结果相差很大。即使storeID不在列表中,原始查询也会返回行。如果您想简化查询总数,可以使用计算机,例如使用
SUM(如果storeID在('E13'、'E15'、'E10')中,则为stock+传入-传出,否则为0 END)
@AndreLoker,您是对的。然而,看起来他们在寻找一些特定商店的库存。如果我有一家库存量大的企业(比如1000件),而我关心的地点只有200件,我就不会想要一份我永远不会看的膨胀清单。如果不知道确切的要求,很难说该走哪条路。至少我们已经展示了多种简化查询的方法,以便原始作者可以选择最适合他的方法。不过,这并不能解决他最初的问题。@AndreLoker我按照你的建议简化了sql查询。问题仍然存在,但代码现在可读性更强了。谢谢@太棒了,你有没有按照别人的建议去做,并尝试在你的调试器中“一步一步地完成”这件事。。我会在执行查询时立即开始,查看是否遇到任何SQL错误,并且不返回结果集。然后,在For EACH中,确保属性的get/set代码获取值。通过将要传递到函数中的数据列的“监视”窗口表达式预先检查调试器中的值。有时,执行“SUM()”将返回一个十进制或双精度,如果您希望得到INT,这可能会使您感到窒息。您的另一个查询将返回非常不同的结果。即使storeID不在列表中,原始查询也会返回行。如果您想简化查询总数,可以使用计算机,例如使用
SUM(如果storeID在('E13'、'E15'、'E10')中,则为stock+传入-传出,否则为0 END)
@AndreLoker,您是对的。然而,看起来他们在寻找一些特定商店的库存。如果我有一家库存量大的企业(比如1000件),而我关心的地点只有200件,我就不会想要一份我永远不会看的膨胀清单。如果不知道确切的要求,很难说该走哪条路。至少我们已经展示了多种简化查询的方法,以便原始作者可以选择最适合他的方法。不过,这并不能解决他最初的问题。@AndreLoker我按照你的建议简化了sql查询。问题仍然存在,但代码现在可读性更强了。谢谢@太棒了,你有没有按照别人的建议去做,并尝试在你的调试器中“一步一步地完成”这件事。。我会在执行查询时立即开始,查看是否遇到任何SQL错误,并且不返回结果集。然后,在For EACH中,确保属性的get/set代码获取值。通过将要传递到函数中的数据列的“监视”窗口表达式预先检查调试器中的值。有时执行“SUM()”将返回十进制或双精度,如果您希望