如何将数据库表的总和存入变量?

5
我有一个名为Deposit的数据库表,其中一个列名为30-12-2013。该列有两个值,如54,26。
我想将该列的总和存入一个变量中。我使用以下代码:
con.Open();
SqlCeCommand cmd11 = con.CreateCommand();
cmd11.CommandText = "select sum(30-12-2013) from Deposit";
int result = ((int)cmd11.ExecuteScalar());
displaylabel.Text = result.ToString();
con.Close();

但是,我得到的变量'result'的值为-3990。

我的代码有什么问题..请帮帮我..提前感谢..


10
你的栏目名是30-12-2013?我只是想知道为什么? - Dimitar Dimitrov
9
您有一个名为“30-12-2013”的列吗?请回答“不是”。 - Soner Gönül
5
不到 24 小时你的数据库表格将过时 :) - Sergey Berezovskiy
2
您的存款表应该有日期/时间和金额的单独列。然后只需使用 SELECT SUM(amount) FROM Deposit WHERE ... - Martin Smith
列名有什么问题吗? - Jayesh Babu
谢谢,我得到了答案。我添加了方括号。但是,请问有人知道列名有什么问题吗? - Jayesh Babu
3个回答

16

(30-12-2013) * 2 (因为你有两个条目) = -1995 * 2 = -3990

你必须使用:

SELECT sum([30-12-2013])
FROM   dbo.Deposit 

抱歉,它们是被支持的。 - ErikEJ
@ErikEJ - 好的,谢谢您的澄清。已删除与显然存在冲突的文档无关的评论。 - Martin Smith
这个 -1995 是什么意思? - Jayesh Babu

6

尝试使用括号来表示具有非常规名称的列 -

cmd11.CommandText = "SELECT SUM([30-12-2013]) FROM Deposit";

我无法使用 'dbo.Deposit'。错误显示为“表名无效”。 - Jayesh Babu

6

已经有人回答了你的问题,所以我不会回答你实际的问题,而是提出一个替代方案。

不要使用以下表格:

SomeColumn | 30-12-2013 | 31-12-2013 | 01-01-2014
-----------+------------+------------+------------
    A      |    540     |    100     |    246
    B      |    130     |     90     |    377

需要创建一个规范化的表:

SomeColumn |    Date    | Amount 
-----------+------------+--------
   A       | 2013-12-30 |  540
   A       | 2013-12-31 |  100
   A       | 2014-01-01 |  246
   B       | 2013-12-30 |  130
   B       | 2013-12-31 |  90
   B       | 2014-01-01 |  377

这意味着你不需要为每一天创建一个新的列。因此,你的查询语句应该是这样的:
SELECT  SUM(Amount) AS Amount
FROM    Deposit
WHERE   Date = '20131230';

如果您想要复制您的原始结构,可以使用以下方法:

SELECT  SomeColumn,
        SUM(CASE WHEN Date = '20131230' THEN Amount ELSE 0 END) AS [30-12-2013],
        SUM(CASE WHEN Date = '20131231' THEN Amount ELSE 0 END) AS [31-12-2013],
        SUM(CASE WHEN Date = '20140101' THEN Amount ELSE 0 END) AS [01-01-2014]
FROM    Deposit
GROUP BY SomeColumn;

SQL Fiddle上的示例 (因为它不支持SQL Server CE,所以使用SQL Server)


谢谢您,先生。我明白了。请问是否有一种方法可以逐行求和,这样我就可以找到A、B、C存款的总金额了吗? - Jayesh Babu
是的,但如果我在DataGridView中显示表格,有没有使用循环的方法呢? - Jayesh Babu
这听起来像是变成了一个新问题,因为我不立刻明白为什么你想要循环。我建议你提出一个新问题,将数据以从数据库检索到的格式放入其中,并说明你是如何绑定到gridview的以及你最终想要实现什么。 - GarethD
我必须在DataGridView中显示这个表格,所以我才问这个问题。 - Jayesh Babu
是的,这可能是你问这个问题的原因,但这不是你在这个问题中所问的。它仍然是两个单独的问题。无论如何,有一种非常好的方法可以避免重复列,即规范化你的数据库,然后你可以在应用层内部进行数据透视,像这样进行数据透视(http://sqlfiddle.com/#!6/b08e2/3),或者使用动态SQL来透视数据。 - GarethD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接