【发布时间】:2012-12-13 21:15:27
【问题描述】:
平台:SQL Server 2005 Express
免责声明:我是 SQL 的新手,所以如果您乐于帮助解决一个可能非常简单的问题,那么如果您说话缓慢并使用小词,我不会被冒犯 :-)
我有一个表,我想对多行的内容求和。但是,我只想对另一列中第一次出现的文本求和一列。
Table schema for table 'tblMain'
fldOne {varchar(100)} Example contents: “Dandelion“
fldTwo {varchar(8)} Example contents: “01:00:00” (represents hh:mm:ss)
fldThree {numeric(10,0)} Example contents: “65”
表格内容:
如果我使用:
Select * from tblMain where fldTwo < ’05:00:00’ order by fldOne, fldTwo desc
然后所有行都正确返回,由 fldOne 和 fldTwo 降序排序(尽管在我展示的示例数据中,所有数据都已经按正确的顺序排列!)
我想做的是获取每个 fldThree 的 SUM,但只能从每个 fldOne 的第一次出现。
所以,求和我遇到的第一个蒲公英、黛西和玫瑰。例如。 99+88+55
目前,我正在以编程方式执行此操作;从上面的 Select 语句返回一个 RecordSet,并 MoveNext 遍历每个返回的行,如果我从未见过 中的文本,则仅将 fldThree 添加到我的“总数”中fldOne 之前。它可以工作,但大多数 Select 查询返回超过 100k 行,因此速度很慢(慢是一个相对术语——我的设置大约需要 50 秒)。
实际的 select 语句(从 1.5m 总行中选择大约 100k 行)在一秒钟内完成,这很好。当前的程序循环非常小且紧凑,只是通过 RecordSet 的循环数需要时间。我在打开记录集时使用了 adOpenForwardOnly 和 adLockReadOnly。
这是一个基本上随着更多数据的添加而连续运行的例程,而且 fldTwo 'times' 会有所不同,所以我不能更具体地使用 Select 语句。
到目前为止,我用 SQL 本地完成的所有事情似乎都运行得很快,我希望我可以将逻辑(和工作)从我的程序中剥离出来,让 SQL 来承担压力。
提前致谢
【问题讨论】:
-
嗨,Kaf - 是的,MS SQL 2005 Express。
-
人们已经回答了,所以我不必回答。我知道您是新手,因此请尝试使用必填标签标记您的问题,这在回答时会有所帮助。作为回报,您会很快得到相关的答案。
-
嗨@Kaf。我很感激人们在有人刚加入论坛时表现出的耐心,如果我错过了一些观点,我会道歉。我使用了标签“SQL”、“SUM”和“CONDITIONAL”并尝试了“2005”,但作为新用户,我无法创建新标签。我的错误是缺少“sql-server”标签(现已修复)。我确实在帖子的开头添加了一个标题,旨在澄清事情,但感谢它不如适当的标签好。现在所有标签都已排序,这将有助于其他从哈姆雷特和戈登那里寻找王牌答案的人。问候,伊恩。
-
嘿,没关系。这只是一些有用的提示。这里有很多好人愿意提供知识和建议。
标签: sql sql-server sum conditional