高分求简单高效率的SQL语句,在线等

antsing_2008 2008-09-08 05:02:49
--本人解决的方法有点累赘,希望能顶出好的办法,谢谢!
create table #x_FgMst --产品表
(
ffgcode varchar(30) not null --套件
)

create table #x_FgUp --单价表
(
ffgcode varchar(30) not null,--品号(可以是分件或者套件)
fup decimal(18,6) null
)

create table #x_BOMSet --配套表
(
fpfgcode varchar(30) not null,--套件
ffgcode varchar(30) not null, --分件
fqty decimal(18,6) null --配套数量
)
truncate table #x_FgMst
insert into #x_FgMst(ffgcode)
select 'A'
UNION
SELECT 'B'
UNION
select 'C'

truncate table #x_FgUp
insert into #x_FgUp(ffgcode,fup)
select 'A1',1
UNION
SELECT 'A2',1
UNION
select 'A3',1
UNION
select 'B1',1
UNION
select 'C1',1
UNION
SELECT 'A',1
truncate table #x_BOMSet
insert into #x_BOMSet(fpfgcode,ffgcode,fqty)
select 'A','A1',1
UNION
SELECT 'A','A2',1
UNION
select 'A','A3',1
UNION
select 'B','B1',1
UNION
SELECT 'B','B2',1
UNION
select 'C','C1',1

------------------------------
--求套件价
--1,如果套件有单价则取套件价,否则取sum(分件的数量*分件对应的单价)
--2,如果为配套关系显示为0
--3, 如果套件对应的分件任意一个没单价,则该套件也为0
...全文
100 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
antsing_2008 2008-09-08
  • 打赏
  • 举报
回复
谢谢,厉害,我怎样就写不出呢,结帖,下次再找你帮忙
中国风 2008-09-08
  • 打赏
  • 举报
回复

select
a.ffgcode,coalesce(b.fup,c.fup,0)fup
from
#x_FgMst a
left join
#x_FgUp b on a.ffgcode=b.ffgcode
left join
(select a.[fpfgcode],fup=sum(a.fqty*b.fup) from #x_BOMSet a left join #x_FgUp b on a.ffgcode=b.ffgcode group by a.[fpfgcode] having min(isnull(b.fup,0))>0)c --改一下連接方法left join
on a.ffgcode=c.[fpfgcode]



/*
ffgcode fup
------------------------------ ---------------------------------------
A 1.000000000000
B 0.000000000000
C 1.000000000000

(3 個資料列受到影響)


*/
antsing_2008 2008-09-08
  • 打赏
  • 举报
回复
再说下,分件任意一个无单价,套件返回的都得是0
antsing_2008 2008-09-08
  • 打赏
  • 举报
回复
大侠,也不对啊,对不起,我需求没说清楚,应该返回的是:
a 1
b 0
c 1
如果套件有单价,就不能再取分件,只需要拿套件的单价
中国风 2008-09-08
  • 打赏
  • 举报
回复

select
a.ffgcode,coalesce(c.fup,b.fup,0)fup
from
#x_FgMst a
left join
#x_FgUp b on a.ffgcode=b.ffgcode
left join
(select a.[fpfgcode],fup=sum(a.fqty*b.fup) from #x_BOMSet a left join #x_FgUp b on a.ffgcode=b.ffgcode group by a.[fpfgcode] having isnull(min(b.fup),0)>0)c --改一下連接方法left join
on a.ffgcode=c.[fpfgcode]

/*
ffgcode fup
------------------------------ ---------------------------------------
A 3.000000000000
B 1.000000000000
C 1.000000000000

(3 個資料列受到影響)


*/
中国风 2008-09-08
  • 打赏
  • 举报
回复
create table #x_FgMst  --产品表
(
ffgcode varchar(30) not null --套件
)

create table #x_FgUp --单价表
(
ffgcode varchar(30) not null,--品号(可以是分件或者套件)
fup decimal(18,6) null
)

create table #x_BOMSet --配套表
(
fpfgcode varchar(30) not null,--套件
ffgcode varchar(30) not null, --分件
fqty decimal(18,6) null --配套数量
)
truncate table #x_FgMst
insert into #x_FgMst(ffgcode)
select 'A'
UNION
SELECT 'B'
UNION
select 'C'

truncate table #x_FgUp
insert into #x_FgUp(ffgcode,fup)
select 'A1',1
UNION
SELECT 'A2',1
UNION
select 'A3',1
UNION
select 'B1',1
UNION
select 'C1',1
UNION
SELECT 'A',1
truncate table #x_BOMSet
insert into #x_BOMSet(fpfgcode,ffgcode,fqty)
select 'A','A1',1
UNION
SELECT 'A','A2',1
UNION
select 'A','A3',1
UNION
select 'B','B1',1
UNION
SELECT 'B','B2',1
UNION
select 'C','C1',1

select
a.ffgcode,coalesce(c.fup,b.fup,0)fup
from
#x_FgMst a
left join
#x_FgUp b on a.ffgcode=b.ffgcode
left join
(select a.[fpfgcode],fup=sum(a.fqty*b.fup) from #x_BOMSet a join #x_FgUp b on a.ffgcode=b.ffgcode group by a.[fpfgcode] having isnull(min(b.fup),0)>0)c
on a.ffgcode=c.[fpfgcode]


ffgcode fup
------------------------------ ---------------------------------------
A 3.000000000000
B 1.000000000000
C 1.000000000000

(3 個資料列受到影響)

antsing_2008 2008-09-08
  • 打赏
  • 举报
回复
--2,如果无配套关系显示为0
antsing_2008 2008-09-08
  • 打赏
  • 举报
回复
1楼说的没错,是实际表
antsing_2008 2008-09-08
  • 打赏
  • 举报
回复
为什么C的单价没呢?应该也是1吧
Herb2 2008-09-08
  • 打赏
  • 举报
回复
create table #x_FgMst  --产品表 
(
ffgcode varchar(30) not null --套件
)

create table #x_FgUp --单价表
(
ffgcode varchar(30) not null,--品号(可以是分件或者套件)
fup decimal(18,6) null
)

create table #x_BOMSet --配套表
(
fpfgcode varchar(30) not null,--套件
ffgcode varchar(30) not null, --分件
fqty decimal(18,6) null --配套数量
)
select a.ffgcode ,isnull(isnull(b.p,c.p),d.p)
from #x_FgMst a left join #x_fgup b on a.ffgcode = b.ffgcode
left join (select ffgcode,p=0 from #x_bomset group ffgcode) c on a.ffgcode = c.ffgcode
left join (select fgfgcode,p=0 from #x_bomset d1
where exists(select 1 from #x_fgup where fup = 0 and ffgcode in
(select ffgcode from #x_bomset where fgfgcode = d1.fgfgcode))
group by fgfgcode )
d on a.ffgcode = d.ffgcode
left join (select fgfgcode,p=(select sum(fup) from #x_fgup where ffgcode in
(select ffgcode from #x_bomset where fgfgcode = e1.fgfgcode) )
from #x_bomset e1 group by fgfgcode )
e on a.ffgcode = e.ffgcode


中国风 2008-09-08
  • 打赏
  • 举报
回复
select
a.ffgcode,coalesce(c.fup,b.fup,0)fup
from
#x_FgMst a
left join
#x_FgUp b on a.ffgcode=b.ffgcode
left join
(select a.[ffgcode],fup=sum(a.fqty*b.fup) from #x_BOMSet a join #x_FgUp b on a.ffgcode=b.ffgcode
where exists(select 1 from #x_FgUp c where not exists(select 1 from #x_BOMSet where fpfgcode=a.fpfgcode and ffgcode=c.ffgcode)) group by a.[ffgcode])c
on a.ffgcode=c.ffgcode
/*
ffgcode fup
------------------------------ ---------------------------------------
A 1.000000000000
B 0.000000000000
C 0.000000000000

(3 個資料列受到影響)

*/

中国风 2008-09-08
  • 打赏
  • 举报
回复
以上的結果應該是
A 1.000000000000
B 0
C 0
昵称被占用了 2008-09-08
  • 打赏
  • 举报
回复
最好用函数来实现,你的表应该是实际表吧,临时表函数实现不了

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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