select * from(
select 1 a,0 sort
union all
select 2,2 sort
union all
select 1,3 sort
union all
select 2,4 sort
union all
select 1,5 sort
union all
select 2,6 sort
union all
select 1,7 sort
union all
select 2,8 sort
union all
select 1 ,9 sort)x order by sort
我现在有一个参数 5 那么我只要显示1-4行结果 sum(a) 结果6 > 5条件满足
显示结果
1 0
2 1
1 2
2 3
可能大家都没看明白我提的问题,事实上是一个财务冲帐问题.
union 事实上是一个表..是欠帐信息,sort字段是顺序号,相当于主键.a字段表示金额.
当付款某一个金额总额的时候要按顺序找出对应的单进行冲减.譬如例子5,那么从0-4条
加起来的金额就>=5,所以只要找出0-4就是我在下面列出的结果.
再举一个3..那么1-2的金额和>=3 那结果就是
1 0
2 1
这样的需求是因为在程序中如果一次查出所有记录,然后进行逐一对比会比较浪费资源,
还有一个做法是使用游标逐一处理.单我用的数据库access不支持游标.所以就有这个问题.
极其希望能找到一个好的查询方案....
额,看了半天总算看懂了,楼主写的后面的结果集有点误导人,本身是一个表却和上面的SQL语句错行了一个,sort是序号
要实现你的需求:
1:创建个临时表 #temp 里面插入你查询的SQL内容(要是有现成的表就直接放进去)
2:select sum(a) from #temp where sort<5
当然以上最好建立个存储过程,因为比较灵活,传参数,输出值,要是不能理解,建议最好直接点 帖出你的表结构,然后说出实际你的想法,你这种想用最简单的例子来表达你的想法是正确的,不过对表达能力有一定的要求,有时候还不如直接点好
有很多时候我不明白,既然设计已经如此糟糕了,还有必要纠结一句SQL还是好多句吗?
如果不要求一句实现的话,
弄个存储过程,弄个cursor,循环一下就搞定了。
查询前4行直接top 4,但是搞不明白sort的值怎么改变了。
我表示没看懂这个sql语句。。。
同意楼上,没看懂你想干什么,也没有看懂你的SQL,感觉这样写是不能运行的。
要不你把你要做的实际情况贴出来
把(select * from(
select 1 a,0 sort
union all
select 2,2 sort
union all
select 1,3 sort
union all
select 2,4 sort
union all
select 1,5 sort
union all
select 2,6 sort
union all
select 1,7 sort
union all
select 2,8 sort
union all
select 1 ,9 sort)x order by sort)
作为一个视图进行查询,加上/*NO MERGE*/
取1-4行用 rownum 判断。
不过你的子查询语句中没有FROM 你注意下,别报错。
既然你是access数据库,你可以DataReader读数据(类似游标),然后在程序代码里面一次读取一条进行汇总(同时将主键Sort字段放入List<int> lstTemp里面去),当满足条件后,将lstTemp就是满足条件的主键集合。
至于剩下的,你想怎么处理都可以了。