sql问题 从b表的明细中n条记录减去总和为a表的一条数据的一个值

程爱动漫 2018-01-10 03:11:58
比如
a表
1,3
2,20
操作前b表
1,5
2,5
3,10
4,8
操作后b表
1,0
b,0
c,0,
d,0
...全文
827 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_18549731 2019-05-27
  • 打赏
  • 举报
回复
我也觉得这个是业务逻辑问题
日月路明 2018-01-12
  • 打赏
  • 举报
回复
我感觉,绝对是业务逻辑有问题
acen_chen 2018-01-11
  • 打赏
  • 举报
回复
表示不是太清楚这结果怎么出来的。。。
OwenZeng_DBA 2018-01-11
  • 打赏
  • 举报
回复
引用 15 楼 chenggaohua 的回复:
[quote=引用 13 楼 z10843087 的回复:] 描述一下真实的业务场景,看看是什么情况的,看看有没有其他的思路
版主大人,我想把每一笔出库,都和出库单对应起来,比如出库100件商品,但是入库单可能有一张或几张,这个问题主要处理的就是一个出库但是有很多记录,然后每个记录都要去找n条入库记录[/quote] 对你的业务不是很熟悉。就我的理解,出库的时候要去找入库记录,目前是按照什么方式去找的。这么找有什么问题,是觉得找起来太慢了吗?
程爱动漫 2018-01-11
  • 打赏
  • 举报
回复
引用 13 楼 z10843087 的回复:
描述一下真实的业务场景,看看是什么情况的,看看有没有其他的思路
版主大人,我想把每一笔出库,都和出库单对应起来,比如出库100件商品,但是入库单可能有一张或几张,这个问题主要处理的就是一个出库但是有很多记录,然后每个记录都要去找n条入库记录
RINK_1 2018-01-11
  • 打赏
  • 举报
回复

select A.*,
case when B.n>=subtotal then 0 when subtotal-A.n<B.n and subtotal>B.n then subtotal-B.n else A.n end as balance
from #cc A
join #aa B ON A.t=B.t
outer apply (select SUM(n) as subtotal from #cc where A.t=t and id<=A.id) as C

OwenZeng_DBA 2018-01-10
  • 打赏
  • 举报
回复
描述一下真实的业务场景,看看是什么情况的,看看有没有其他的思路
ChinaITOldMan 2018-01-10
  • 打赏
  • 举报
回复
not very clear
日月路明 2018-01-10
  • 打赏
  • 举报
回复
引用 10 楼 chenggaohua 的回复:
[quote=引用 9 楼 yisuylm 的回复:] [quote=引用 8 楼 chenggaohua 的回复:] [quote=引用 5 楼 yisuylm 的回复:] 就我个人的理解,你的问题很复杂,可能不是一个普通程序员能解决的问题,而且也可能存在数据冲突的问题,例如: 10=5+5 10=6+4 10=5+4+1 那么,如果A=10有一条记录,是删除5+5的组合,还是删除5+4+1的组合? 就算排除这个冲突问题,在若干组数据中组合出一组数据其和等于a中的某条记录,这真不是一般人能完成的
从最早的开始减啊,不管是5+5,6+4,10,20,我只要减够10就行了,也就是要从x条数据上,减下数字n[/quote] 你的意思按某种顺序排序?例如: 1.5 2.3 3.1 4.2 本来5+3+2满足要求,但是排序的话,就没有任何记录满足要求[/quote] 不管几条,只要够了10就不用减了,之前的清零,本条减差价,那个不是有自增列吗依次减就行了[/quote] 你这样的要求基本无解,你低估了这个问题的难度
程爱动漫 2018-01-10
  • 打赏
  • 举报
回复
引用 9 楼 yisuylm 的回复:
[quote=引用 8 楼 chenggaohua 的回复:] [quote=引用 5 楼 yisuylm 的回复:] 就我个人的理解,你的问题很复杂,可能不是一个普通程序员能解决的问题,而且也可能存在数据冲突的问题,例如: 10=5+5 10=6+4 10=5+4+1 那么,如果A=10有一条记录,是删除5+5的组合,还是删除5+4+1的组合? 就算排除这个冲突问题,在若干组数据中组合出一组数据其和等于a中的某条记录,这真不是一般人能完成的
从最早的开始减啊,不管是5+5,6+4,10,20,我只要减够10就行了,也就是要从x条数据上,减下数字n[/quote] 你的意思按某种顺序排序?例如: 1.5 2.3 3.1 4.2 本来5+3+2满足要求,但是排序的话,就没有任何记录满足要求[/quote] 不管几条,只要够了10就不用减了,之前的清零,本条减差价,那个不是有自增列吗依次减就行了
日月路明 2018-01-10
  • 打赏
  • 举报
回复
引用 8 楼 chenggaohua 的回复:
[quote=引用 5 楼 yisuylm 的回复:] 就我个人的理解,你的问题很复杂,可能不是一个普通程序员能解决的问题,而且也可能存在数据冲突的问题,例如: 10=5+5 10=6+4 10=5+4+1 那么,如果A=10有一条记录,是删除5+5的组合,还是删除5+4+1的组合? 就算排除这个冲突问题,在若干组数据中组合出一组数据其和等于a中的某条记录,这真不是一般人能完成的
从最早的开始减啊,不管是5+5,6+4,10,20,我只要减够10就行了,也就是要从x条数据上,减下数字n[/quote] 你的意思按某种顺序排序?例如: 1.5 2.3 3.1 4.2 本来5+3+2满足要求,但是排序的话,就没有任何记录满足要求
程爱动漫 2018-01-10
  • 打赏
  • 举报
回复
引用 5 楼 yisuylm 的回复:
就我个人的理解,你的问题很复杂,可能不是一个普通程序员能解决的问题,而且也可能存在数据冲突的问题,例如: 10=5+5 10=6+4 10=5+4+1 那么,如果A=10有一条记录,是删除5+5的组合,还是删除5+4+1的组合? 就算排除这个冲突问题,在若干组数据中组合出一组数据其和等于a中的某条记录,这真不是一般人能完成的
从最早的开始减啊,不管是5+5,6+4,10,20,我只要减够10就行了,也就是要从x条数据上,减下数字n
日月路明 2018-01-10
  • 打赏
  • 举报
回复
你的问题的本质就是,把 b中数据所有可能的组合都计算一边,计算结果在a中,就删除这种组合涉及到的记录,然后对剩下的数据继续这种操作,如果没有一套有效的算法,靠暴力计算,对计算机是一个很严峻的考验
日月路明 2018-01-10
  • 打赏
  • 举报
回复
我的建议,直接放弃这个问题,重新整理你的业务逻辑,看看有没有替代方案
日月路明 2018-01-10
  • 打赏
  • 举报
回复
就我个人的理解,你的问题很复杂,可能不是一个普通程序员能解决的问题,而且也可能存在数据冲突的问题,例如: 10=5+5 10=6+4 10=5+4+1 那么,如果A=10有一条记录,是删除5+5的组合,还是删除5+4+1的组合? 就算排除这个冲突问题,在若干组数据中组合出一组数据其和等于a中的某条记录,这真不是一般人能完成的
程爱动漫 2018-01-10
  • 打赏
  • 举报
回复
引用 1 楼 yisuylm 的回复:
麻烦楼主把问题描述清楚
引用 2 楼 sinat_28984567 的回复:
建议楼主列出表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
两位老大,帮我看看像这样的,除了游标还有其他方法吗,用游标的话,如果数据量比较大,该怎么优化呢
程爱动漫 2018-01-10
  • 打赏
  • 举报
回复

if(object_id('tempdb..#aa','U')is not null)
drop table tempdb..#aa
if(object_id('tempdb..#cc','U')is not null)
drop table tempdb..#cc

select * into #cc from
(
select 1 as 'id','A' as 't',10 as 'n'
union all select 2 ,'A',10
union all select 3 ,'A',10
union all select 4 ,'B',10
union all select 5 ,'B',10
union all select 6 ,'B',10
) a

select * into #aa from
(
select 'A' as 't',15 as 'n'
union all select 'B',8
)a

select * from #aa
select * from #cc

declare @maxid int,@num int,@n int ,@t varchar(1)
select @t='A',@num=15,@n=0,@maxid=0

select @maxid=min(a.id) from #cc a where t=@t and
isnull((select sum(n) from #cc where t=@t and id<=a.id),0)>=@num

select @n= sum(n) from #cc where t=@t and id<@maxid

update #cc set n=0 where t=@t and id<@maxid

update #cc set n=n-(@num-@n) where id=@maxid

select * from #cc

if(object_id('tempdb..#aa','U')is not null)
drop table tempdb..#aa
if(object_id('tempdb..#cc','U')is not null)
drop table tempdb..#cc
日月路明 2018-01-10
  • 打赏
  • 举报
回复
麻烦楼主把问题描述清楚
二月十六 2018-01-10
  • 打赏
  • 举报
回复
建议楼主列出表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧