请教个难题.实在想不出来了.

时间:2022-04-30 19:13:55
利润分成方式有多中,比如:
1这个业务是1/9
2这个业务是2/8
N01这个行型的是5/5
那么现在我现在遇到这个问题。假如这台机运行这个业务,那么它必须使用指定的分成方式,如N01这种机器运行2这个业务,那么它的分成方式为5/5而如果
N02这个机器运行2这个业务,那么它采用的分成方式为2/8.
那么我现在遇到这问题。我必须先判断这机器是不是有它自己的分成业务,如果有,就用它的,如果没有就按业务规定的分成方式.
select case when 1=1 then 'a' when 2=2 then 'b'
得到是'a',所以我想这么写:
select case when exists (select ratio from baseinfo where xh=xhnum) then 
       select ratio from baseinfo where xh=xhnum
      case when exists (select ratio from baseinfo where yw=ywnum)  then   select ratio from baseinfo where yw=ywnum else 1 end 

但是这样的写法不可以实现,有其它办法可以实现吗?

17 个解决方案

#1


这个问题实在没有看明白.

#2


就是这样的,假如有2中交易类型:直接交易,间接交易.
那这些交易的利润分成:直接交易分法是20/80,间接交易分法是30/70,E20这样的机器上的这些业务分法是50/50(就是说不管是直接交易还是间接交易,都是按50/50分)
现在假如我们有两台机器,E10,E20,现在要算利润了,
E10上面的直接交易分法是20/80,间接交易分法是30/70.
E20上面的直接交易分法是50/50,间接交易分法是50/50.


#3


用left join

select 
case when b.id is null then ...       ----相当于你的not exists 
    else ...
    end
from a left join b on ...

#4


也就是说E20上面虽然有直接交易和间接交易,但是它是有规定的按50/50分,所以它要优先采用 直接交易分法是50/50,间接交易分法是50/50.

#5


文字这么解释多累呀,你不如贴出表结构,例子数据,要的结果,必要的文字解释一下,这里除了冒牌的都是高手,看结构和数据不用看结是都能做出来。

#6


好的,你们等一下.

#7


table1 

id
ratio     --分成数据
ratio_memo  --备注
ratio_kind  --分成方式  1是业务1,2是业务2 


id   ratio   ratio_Memo   ratio_kind
1    50/50                 1
2    40/60                 2
3    20/80    E40          1
4    30/70    E40          2


table2 
Mach_num  --机器编号
jy_1      --交易量
jy_xl    --交易类型

Mach_num  jy_1  jy_xl
0001      3000  1
0002      4000  2
0003      2322  2

table2 
Mach_num  --机器编号
mach_xh   --机器型号

mach_num   mach_xh
0001       E40
0002       E10
0003       E20

得到结果
mach_num  jy_l     ratio
0001      3000     20/80
0002      4000     40/60
0003      2322     40/60 

#8


select a.Mach_num,a.jy_1,
case when c.ratio is null then d.ratio else c.ratio end as ratio
from table2 a inner join table2 b
on a.Mach_num=b.Mach_num
left join table1 c
on c.ratio_Memo=b.mach_xh and c.ratio_kind=a.jy_xl
left join table1 d
on c.ratio_Memo='' and c.ratio_kind=a.jy_xl

#9


有些错误,改正测试:

--建立环境
create table table1 (
id int,
ratio varchar(20),    --分成数据
ratio_memo varchar(20), --备注
ratio_kind  int --分成方式  1是业务1,2是业务2 
)
go

insert table1
select
1,    '50/50',    '',             1
union all select
2,    '40/60',    '' ,            2
union all select
3,    '20/80',    'E40',          1
union all select
4,    '30/70' ,   'E40' ,         2
go


create table table2 (
Mach_num varchar(20), --机器编号
jy_1   int,   --交易量
jy_xl  int  --交易类型

go

insert table2
select
'0001',      3000,  1
union all select
'0002',      4000,  2
union all select
'0003',      2322,  2

go

create table table3 (
Mach_num varchar(20), --机器编号
mach_xh  varchar(20) --机器型号
)
go

insert table3
select
'0001',       'E40'
union all select
'0002',       'E10'
union all select
'0003',       'E20'
go

--修改后的语句
select a.Mach_num,a.jy_1,
case when c.ratio is null then d.ratio else c.ratio end as ratio
from table2 a inner join table3 b                       --这里改了
on a.Mach_num=b.Mach_num
left join table1 c
on c.ratio_Memo=b.mach_xh and c.ratio_kind=a.jy_xl
left join table1 d
on d.ratio_Memo='' and d.ratio_kind=a.jy_xl              --这里改了
go

--结果
/*
Mach_num             jy_1        ratio                
-------------------- ----------- -------------------- 
0001                 3000        20/80
0002                 4000        40/60
0003                 2322        40/60

(所影响的行数为 3 行)
*/

#10


我试试,多谢.

#11


zicxc(冒牌邹建 V0.3) ( ):
那个备注里面不是只存放机器编号的,有可能有其它的备注信息,你这么写的意思好象是说不为空的就是有机器型号的.我的实际要求不是这样的。

#12


Mach_num             jy_1        直接业务    间接业务
-------------------- ----------- -------------------- 
0001                 3000        20/80     30/70   
0002                 4000        1      40/60
0003                 2322        1     40/60

#13


把例子改成你的一样的,要求也改成你的一样的

现在看不清楚

#14


哪个字段和哪个字段对应

#15


你有QQ吗?因为做的是银行的东西,不好贴太多东西.

#16


table1 

id
ratio     --分成数据
ratio_memo  --备注
ratio_kind  --分成方式  1是业务1,2是业务2 


id   ratio   ratio_Memo   ratio_kind
1    50/50   '没有使用'    1
2    40/60   '更换配件'    2
3    20/80    E40          1
4    30/70    E40          2
我的意思就是说ratio_memo这个字段不只是存放机器型号的。

所以
select a.Mach_num,a.jy_1,
case when c.ratio is null then d.ratio else c.ratio end as ratio
from table2 a inner join table3 b                       --这里改了
on a.Mach_num=b.Mach_num
left join table1 c
on c.ratio_Memo=b.mach_xh and c.ratio_kind=a.jy_xl
left join table1 d
on d.ratio_Memo='' and d.ratio_kind=a.jy_xl              --这里改了
go

中的on d.ratio_Memo=''不可以这么写.

#17


select a.Mach_num,a.jy_1,
case when c.ratio is null then d.ratio else c.ratio end as ratio
from table2 a inner join table3 b                      
on a.Mach_num=b.Mach_num
left join table1 c
on c.ratio_Memo=b.mach_xh and c.ratio_kind=a.jy_xl
left join table1 d
on d.ratio_Memo not in (select mach_xh from table3) and d.ratio_kind=a.jy_xl

#1


这个问题实在没有看明白.

#2


就是这样的,假如有2中交易类型:直接交易,间接交易.
那这些交易的利润分成:直接交易分法是20/80,间接交易分法是30/70,E20这样的机器上的这些业务分法是50/50(就是说不管是直接交易还是间接交易,都是按50/50分)
现在假如我们有两台机器,E10,E20,现在要算利润了,
E10上面的直接交易分法是20/80,间接交易分法是30/70.
E20上面的直接交易分法是50/50,间接交易分法是50/50.


#3


用left join

select 
case when b.id is null then ...       ----相当于你的not exists 
    else ...
    end
from a left join b on ...

#4


也就是说E20上面虽然有直接交易和间接交易,但是它是有规定的按50/50分,所以它要优先采用 直接交易分法是50/50,间接交易分法是50/50.

#5


文字这么解释多累呀,你不如贴出表结构,例子数据,要的结果,必要的文字解释一下,这里除了冒牌的都是高手,看结构和数据不用看结是都能做出来。

#6


好的,你们等一下.

#7


table1 

id
ratio     --分成数据
ratio_memo  --备注
ratio_kind  --分成方式  1是业务1,2是业务2 


id   ratio   ratio_Memo   ratio_kind
1    50/50                 1
2    40/60                 2
3    20/80    E40          1
4    30/70    E40          2


table2 
Mach_num  --机器编号
jy_1      --交易量
jy_xl    --交易类型

Mach_num  jy_1  jy_xl
0001      3000  1
0002      4000  2
0003      2322  2

table2 
Mach_num  --机器编号
mach_xh   --机器型号

mach_num   mach_xh
0001       E40
0002       E10
0003       E20

得到结果
mach_num  jy_l     ratio
0001      3000     20/80
0002      4000     40/60
0003      2322     40/60 

#8


select a.Mach_num,a.jy_1,
case when c.ratio is null then d.ratio else c.ratio end as ratio
from table2 a inner join table2 b
on a.Mach_num=b.Mach_num
left join table1 c
on c.ratio_Memo=b.mach_xh and c.ratio_kind=a.jy_xl
left join table1 d
on c.ratio_Memo='' and c.ratio_kind=a.jy_xl

#9


有些错误,改正测试:

--建立环境
create table table1 (
id int,
ratio varchar(20),    --分成数据
ratio_memo varchar(20), --备注
ratio_kind  int --分成方式  1是业务1,2是业务2 
)
go

insert table1
select
1,    '50/50',    '',             1
union all select
2,    '40/60',    '' ,            2
union all select
3,    '20/80',    'E40',          1
union all select
4,    '30/70' ,   'E40' ,         2
go


create table table2 (
Mach_num varchar(20), --机器编号
jy_1   int,   --交易量
jy_xl  int  --交易类型

go

insert table2
select
'0001',      3000,  1
union all select
'0002',      4000,  2
union all select
'0003',      2322,  2

go

create table table3 (
Mach_num varchar(20), --机器编号
mach_xh  varchar(20) --机器型号
)
go

insert table3
select
'0001',       'E40'
union all select
'0002',       'E10'
union all select
'0003',       'E20'
go

--修改后的语句
select a.Mach_num,a.jy_1,
case when c.ratio is null then d.ratio else c.ratio end as ratio
from table2 a inner join table3 b                       --这里改了
on a.Mach_num=b.Mach_num
left join table1 c
on c.ratio_Memo=b.mach_xh and c.ratio_kind=a.jy_xl
left join table1 d
on d.ratio_Memo='' and d.ratio_kind=a.jy_xl              --这里改了
go

--结果
/*
Mach_num             jy_1        ratio                
-------------------- ----------- -------------------- 
0001                 3000        20/80
0002                 4000        40/60
0003                 2322        40/60

(所影响的行数为 3 行)
*/

#10


我试试,多谢.

#11


zicxc(冒牌邹建 V0.3) ( ):
那个备注里面不是只存放机器编号的,有可能有其它的备注信息,你这么写的意思好象是说不为空的就是有机器型号的.我的实际要求不是这样的。

#12


Mach_num             jy_1        直接业务    间接业务
-------------------- ----------- -------------------- 
0001                 3000        20/80     30/70   
0002                 4000        1      40/60
0003                 2322        1     40/60

#13


把例子改成你的一样的,要求也改成你的一样的

现在看不清楚

#14


哪个字段和哪个字段对应

#15


你有QQ吗?因为做的是银行的东西,不好贴太多东西.

#16


table1 

id
ratio     --分成数据
ratio_memo  --备注
ratio_kind  --分成方式  1是业务1,2是业务2 


id   ratio   ratio_Memo   ratio_kind
1    50/50   '没有使用'    1
2    40/60   '更换配件'    2
3    20/80    E40          1
4    30/70    E40          2
我的意思就是说ratio_memo这个字段不只是存放机器型号的。

所以
select a.Mach_num,a.jy_1,
case when c.ratio is null then d.ratio else c.ratio end as ratio
from table2 a inner join table3 b                       --这里改了
on a.Mach_num=b.Mach_num
left join table1 c
on c.ratio_Memo=b.mach_xh and c.ratio_kind=a.jy_xl
left join table1 d
on d.ratio_Memo='' and d.ratio_kind=a.jy_xl              --这里改了
go

中的on d.ratio_Memo=''不可以这么写.

#17


select a.Mach_num,a.jy_1,
case when c.ratio is null then d.ratio else c.ratio end as ratio
from table2 a inner join table3 b                      
on a.Mach_num=b.Mach_num
left join table1 c
on c.ratio_Memo=b.mach_xh and c.ratio_kind=a.jy_xl
left join table1 d
on d.ratio_Memo not in (select mach_xh from table3) and d.ratio_kind=a.jy_xl