table f1 (co1 为主键)
id co1 num1
1 a 50
2 b 100
3 c 71
4 d 58
table f2(cof2 为f1 表 co1 的外键)
id cof2 num
1 a 20
2 a 50
3 b 30
4 b 50
5 b 10
6 b 20
7 c 80
8 c 14
9 d 50
10 d 3
… … …
现在我要求1.以f1表中的字段为条件,当f1表中字段名a中的值50在f2表中存在现有的值则直接去f2中的值例题中的f2的id=2等相关值
2.当f1表中例字段名b的值在f2表中并不能直接取得值,当有某些字段相加会符合条件,则分别求出符合条件的字段然后取出他们的id等值,注意哦!是直接抓f2表中的符合条件的和的列值,而不是总和,而且有一点需要注意的那就是可能像题中就只有3行(3,4,6)的和符合条件但是5的字段名同为b却不可以要(不知道怎么处理)
3.当在f2表中找不到符合1,2条件的则直接显示f1所对应的字段名的值
17 个解决方案
#1
不明白说的什么意思啊!
写清楚点啊!
写清楚点啊!
#2
晕了。那结果到底应该是怎样的呢?
#3
路过,貌似有点难,那个b的值不好求,除非是函数或者存储过程.
#4
复杂,帮顶.
#5
额 就是我先说下第一种情况这个我会 select f2.id,f2.cof2,f2.num from f1 inner join f2 on f1.co1=f2.cof2 where f2.num=@num (@num 是我第一的一个游标的传递值---我想利用游标,但是好像有人提供纯select 只是我第二步做不出来! 哎 )
麻烦各位在帮帮忙了,谢谢啦!
麻烦各位在帮帮忙了,谢谢啦!
#6
结果就是
要这样的格式
id Uid co num
1 2 a 50
2 3 b 30
3 4 b 50
4 6 b 20
5 3 c 71
6 4 d 58
红色的 是我自动用select identity(int,1,1) as id ,……生成的一个自增id, 而最后两行是由于f1表中不能查找到符合条件的值,就还是带F1的原字段,这样描述能清楚吗?
要这样的格式
id Uid co num
1 2 a 50
2 3 b 30
3 4 b 50
4 6 b 20
5 3 c 71
6 4 d 58
红色的 是我自动用select identity(int,1,1) as id ,……生成的一个自增id, 而最后两行是由于f1表中不能查找到符合条件的值,就还是带F1的原字段,这样描述能清楚吗?
#7
如果有N种组合符合条件怎么处理
比如还有B 40,B 70...
比如还有B 40,B 70...
#8
现在我遇到的难题就是
所说的问题
哎
我是想用存储过程配合游标来做,但是还在混乱中 ,哎 希望有看到的可以关注下
帮帮忙了!谢谢啦!
所说的问题
哎
我是想用存储过程配合游标来做,但是还在混乱中 ,哎 希望有看到的可以关注下
帮帮忙了!谢谢啦!
#9
类似于库存的变吧
#10
为什么这种问题都这么多跟帖..我的问题怎么没人答理!!
http://topic.csdn.net/u/20080415/13/78dc8b89-59bb-4c4b-a921-5483cec6471a.html?seed=2044235486
http://topic.csdn.net/u/20080415/13/78dc8b89-59bb-4c4b-a921-5483cec6471a.html?seed=2044235486
#11
id Uid co num
1 2 a 50
2 3 b 30
3 4 b 50
4 6 b 20
5 7 c 71
6 9 d 50
7 10 d 3
应该是红色的
#12
declare @f1 table(id int,co1 varchar(10),num1 int)
insert @f1 select
1 ,'a', 50 union select
2 ,'b', 100 union select
3 ,'c', 71 union select
4 ,'d', 58
declare @f2 table( id int,cof2 varchar(10),num int)
insert @f2 select
1 ,'a', 20 union select
2 ,'a', 50 union select
3 ,'b', 30 union select
4 ,'b', 50 union select
5 ,'b', 10 union select
6 ,'b', 20 union select
7 ,'c', 80 union select
8 ,'c', 14 union select
9 ,'d', 50 union select
10 ,'d', 3
select px = identity(int,1,1) ,id,cof2,num into # from @f2 order by cof2,num desc
select id,cof2,num
from(
select
a.*,结存=(b.num1-isnull((select sum(num) from # where cof2 = a.cof2 and px<a.px),0))
from
# a,@f1 b
where a.cof2 = b.co1 ) c
where c.结存 >0
drop table #
/*
id cof2 num
----------- ---------- -----------
2 a 50
4 b 50
3 b 30
6 b 20
7 c 80
9 d 50
10 d 3
(所影响的行数为 7 行)
*/
#13
declare @f1 table(id int,co1 varchar(10),num1 int)
insert @f1 select
1 ,'a', 50 union select
2 ,'b', 100 union select
3 ,'c', 71 union select
4 ,'d', 58
declare @f2 table( id int,cof2 varchar(10),num int)
insert @f2 select
1 ,'a', 20 union select
2 ,'a', 50 union select
3 ,'b', 30 union select
4 ,'b', 50 union select
5 ,'b', 10 union select
6 ,'b', 20 union select
7 ,'c', 80 union select
8 ,'c', 14 union select
9 ,'d', 50 union select
10 ,'d', 3
select px = identity(int,1,1) ,id,cof2,num into # from @f2 order by cof2,num desc
select id,cof2,case when num>num1 then num1 else num end as num
from(
select
a.*,b.num1,结存=(b.num1-isnull((select sum(num) from # where cof2 = a.cof2 and px<a.px),0))
from
# a,@f1 b
where a.cof2 = b.co1 ) c
where c.结存 >0
drop table #
/*
id cof2 num
----------- ---------- -----------
2 a 50
4 b 50
3 b 30
6 b 20
7 c 71
9 d 50
10 d 3
(所影响的行数为 7 行)
*/
#14
/*
id cof2 num
----------- ---------- -----------
2 a 50
4 b 50
3 b 30
6 b 20
7 c 71
9 d 50
10 d 3 --f1表中可是58 ,应该扣不完的呀
(所影响的行数为 7 行)
*/
id cof2 num
----------- ---------- -----------
2 a 50
4 b 50
3 b 30
6 b 20
7 c 71
9 d 50
10 d 3 --f1表中可是58 ,应该扣不完的呀
(所影响的行数为 7 行)
*/
#15
谢谢各位的关注
还有“无枪狙击手“同时谢谢你给我提供了一个思路
我会尝试看看
虽然又发现新问题!希望可以解决!
希望有想到好方法的可以在帮帮忙!谢拉!
还有“无枪狙击手“同时谢谢你给我提供了一个思路
我会尝试看看
虽然又发现新问题!希望可以解决!
希望有想到好方法的可以在帮帮忙!谢拉!
#16
不知,帮顶
#17
#1
不明白说的什么意思啊!
写清楚点啊!
写清楚点啊!
#2
晕了。那结果到底应该是怎样的呢?
#3
路过,貌似有点难,那个b的值不好求,除非是函数或者存储过程.
#4
复杂,帮顶.
#5
额 就是我先说下第一种情况这个我会 select f2.id,f2.cof2,f2.num from f1 inner join f2 on f1.co1=f2.cof2 where f2.num=@num (@num 是我第一的一个游标的传递值---我想利用游标,但是好像有人提供纯select 只是我第二步做不出来! 哎 )
麻烦各位在帮帮忙了,谢谢啦!
麻烦各位在帮帮忙了,谢谢啦!
#6
结果就是
要这样的格式
id Uid co num
1 2 a 50
2 3 b 30
3 4 b 50
4 6 b 20
5 3 c 71
6 4 d 58
红色的 是我自动用select identity(int,1,1) as id ,……生成的一个自增id, 而最后两行是由于f1表中不能查找到符合条件的值,就还是带F1的原字段,这样描述能清楚吗?
要这样的格式
id Uid co num
1 2 a 50
2 3 b 30
3 4 b 50
4 6 b 20
5 3 c 71
6 4 d 58
红色的 是我自动用select identity(int,1,1) as id ,……生成的一个自增id, 而最后两行是由于f1表中不能查找到符合条件的值,就还是带F1的原字段,这样描述能清楚吗?
#7
如果有N种组合符合条件怎么处理
比如还有B 40,B 70...
比如还有B 40,B 70...
#8
现在我遇到的难题就是
所说的问题
哎
我是想用存储过程配合游标来做,但是还在混乱中 ,哎 希望有看到的可以关注下
帮帮忙了!谢谢啦!
所说的问题
哎
我是想用存储过程配合游标来做,但是还在混乱中 ,哎 希望有看到的可以关注下
帮帮忙了!谢谢啦!
#9
类似于库存的变吧
#10
为什么这种问题都这么多跟帖..我的问题怎么没人答理!!
http://topic.csdn.net/u/20080415/13/78dc8b89-59bb-4c4b-a921-5483cec6471a.html?seed=2044235486
http://topic.csdn.net/u/20080415/13/78dc8b89-59bb-4c4b-a921-5483cec6471a.html?seed=2044235486
#11
id Uid co num
1 2 a 50
2 3 b 30
3 4 b 50
4 6 b 20
5 7 c 71
6 9 d 50
7 10 d 3
应该是红色的
#12
declare @f1 table(id int,co1 varchar(10),num1 int)
insert @f1 select
1 ,'a', 50 union select
2 ,'b', 100 union select
3 ,'c', 71 union select
4 ,'d', 58
declare @f2 table( id int,cof2 varchar(10),num int)
insert @f2 select
1 ,'a', 20 union select
2 ,'a', 50 union select
3 ,'b', 30 union select
4 ,'b', 50 union select
5 ,'b', 10 union select
6 ,'b', 20 union select
7 ,'c', 80 union select
8 ,'c', 14 union select
9 ,'d', 50 union select
10 ,'d', 3
select px = identity(int,1,1) ,id,cof2,num into # from @f2 order by cof2,num desc
select id,cof2,num
from(
select
a.*,结存=(b.num1-isnull((select sum(num) from # where cof2 = a.cof2 and px<a.px),0))
from
# a,@f1 b
where a.cof2 = b.co1 ) c
where c.结存 >0
drop table #
/*
id cof2 num
----------- ---------- -----------
2 a 50
4 b 50
3 b 30
6 b 20
7 c 80
9 d 50
10 d 3
(所影响的行数为 7 行)
*/
#13
declare @f1 table(id int,co1 varchar(10),num1 int)
insert @f1 select
1 ,'a', 50 union select
2 ,'b', 100 union select
3 ,'c', 71 union select
4 ,'d', 58
declare @f2 table( id int,cof2 varchar(10),num int)
insert @f2 select
1 ,'a', 20 union select
2 ,'a', 50 union select
3 ,'b', 30 union select
4 ,'b', 50 union select
5 ,'b', 10 union select
6 ,'b', 20 union select
7 ,'c', 80 union select
8 ,'c', 14 union select
9 ,'d', 50 union select
10 ,'d', 3
select px = identity(int,1,1) ,id,cof2,num into # from @f2 order by cof2,num desc
select id,cof2,case when num>num1 then num1 else num end as num
from(
select
a.*,b.num1,结存=(b.num1-isnull((select sum(num) from # where cof2 = a.cof2 and px<a.px),0))
from
# a,@f1 b
where a.cof2 = b.co1 ) c
where c.结存 >0
drop table #
/*
id cof2 num
----------- ---------- -----------
2 a 50
4 b 50
3 b 30
6 b 20
7 c 71
9 d 50
10 d 3
(所影响的行数为 7 行)
*/
#14
/*
id cof2 num
----------- ---------- -----------
2 a 50
4 b 50
3 b 30
6 b 20
7 c 71
9 d 50
10 d 3 --f1表中可是58 ,应该扣不完的呀
(所影响的行数为 7 行)
*/
id cof2 num
----------- ---------- -----------
2 a 50
4 b 50
3 b 30
6 b 20
7 c 71
9 d 50
10 d 3 --f1表中可是58 ,应该扣不完的呀
(所影响的行数为 7 行)
*/
#15
谢谢各位的关注
还有“无枪狙击手“同时谢谢你给我提供了一个思路
我会尝试看看
虽然又发现新问题!希望可以解决!
希望有想到好方法的可以在帮帮忙!谢拉!
还有“无枪狙击手“同时谢谢你给我提供了一个思路
我会尝试看看
虽然又发现新问题!希望可以解决!
希望有想到好方法的可以在帮帮忙!谢拉!
#16
不知,帮顶