34,590
社区成员
发帖
与我相关
我的任务
分享
if object_id('tb') is not null drop table tb
if object_id('tb2') is not null drop table tb2
CREATE TABLE [tb]( [PID] varchar(100) NULL , [CID] varchar(100) NULL , [NUM] int NULL)
GO
--插入测试数据
INSERT INTO [tb] ([PID],[CID],[NUM])
SELECT 'A','A1','1' UNION
SELECT 'A','B','2' UNION
SELECT 'A1','B1','1' UNION
SELECT 'A1','B2','2'
GO
CREATE TABLE [tb2]( [Item] varchar(100) NULL , [GX] VARCHAR(10) NULL , [Leadtime] int NULL)
GO
--插入测试数据
INSERT INTO [tb2] ([Item],[GX],[Leadtime])
SELECT 'A','100','3' UNION
SELECT 'A','200','1' UNION
SELECT 'B','100','1' UNION
SELECT 'B','200','2' UNION
SELECT 'A1','100','3' UNION
SELECT 'A1','200','1' UNION
SELECT 'B1','100','2' UNION
SELECT 'B2','100','2'
GO
;
with cte as
(
select PID ,CID,(select sum(Leadtime) from tb2 where tb2.Item=tb.PID) LT from tb where PID='A'
union all
select a.PID,a.CID,LT+Leadtime
from tb a join cte b on a.[PID]=b.CID
join tb2 c on c.Item=a.PID
)
,
cte2 as
(select a.*,Leadtime+isnull((select sum(Leadtime) from tb2 b where b.Item=a.Item and b.GX>a.GX),0)lt2 from tb2 a)
select a.Item,a.GX,dateadd(d,-(isnull(LT,0)+lt2),'2010-09-30') from cte2 a left join cte b on Item=CID
if object_id('tb') is not null drop table tb
if object_id('tb2') is not null drop table tb2
if object_id('#') is not null drop table #
CREATE TABLE [tb]( [PID] varchar(100) NULL , [CID] varchar(100) NULL , [NUM] int NULL)
GO
--插入测试数据
INSERT INTO [tb] ([PID],[CID],[NUM])
SELECT 'A','A1','1' UNION
SELECT 'A','B','2' UNION
SELECT 'A1','B1','1' UNION
SELECT 'A1','B2','2'
GO
CREATE TABLE [tb2]( [Item] varchar(100) NULL , [GX] VARCHAR(10) NULL , [Leadtime] int NULL)
GO
--插入测试数据
INSERT INTO [tb2] ([Item],[GX],[Leadtime])
SELECT 'A','100','3' UNION
SELECT 'A','200','1' UNION
SELECT 'B','100','1' UNION
SELECT 'B','200','2' UNION
SELECT 'A1','100','3' UNION
SELECT 'A1','200','1' UNION
SELECT 'B1','100','2' UNION
SELECT 'B2','100','2'
GO
declare @A int
SET @A=2
;
with cte as
(
select PID ,CID from tb where PID='A'
union all
select a.PID,a.CID
from tb a join cte b on a.[PID]=b.CID
)
select Item,sum(leadtime)as leadtime into # from tb2 where Item in(select distinct PID from cte) group by Item
select * from #
if object_id('tb') is not null drop table tb
if object_id('tb2') is not null drop table tb2
if object_id('#') is not null drop table #
CREATE TABLE [tb]( [PID] varchar(100) NULL , [CID] varchar(100) NULL , [NUM] int NULL)
GO
--插入测试数据
INSERT INTO [tb] ([PID],[CID],[NUM])
SELECT 'A','A1','1' UNION
SELECT 'A','B','2' UNION
SELECT 'A1','B1','1' UNION
SELECT 'A1','B2','2'
GO
CREATE TABLE [tb2]( [Item] varchar(100) NULL , [GX] VARCHAR(10) NULL , [Leadtime] int NULL)
GO
--插入测试数据
INSERT INTO [tb2] ([Item],[GX],[Leadtime])
SELECT 'A','100','3' UNION
SELECT 'A','200','1' UNION
SELECT 'B','100','1' UNION
SELECT 'B','200','2' UNION
SELECT 'A1','100','3' UNION
SELECT 'A1','200','1' UNION
SELECT 'B1','100','2' UNION
SELECT 'B2','100','2'
GO
declare @A int
SET @A=2
;
with cte as
(
select PID ,CID from tb where PID='A'
union all
select a.PID,a.CID
from tb a join cte b on a.[PID]=b.CID
)
select Item,sum(leadtime)as leadtime into # from tb2 where Item in(select distinct PID from cte) group by Item
select * from #
;
with cte2 as
(
select PID ,CID, select sum(Leadtime) from tb2 where tb2.Item=tb.PID) LT from tb where PID='A'
union all
select a.PID,a.CID,LT+leadtime
from tb a join cte2 b on a.[PID]=b.CID
join # c on c.Item=a.PID
)
select * from cte2
--这样就比较容易看懂了
declare @A DATETIME
SET @A='2010-9-30'
;WITH SZY AS(
SELECT B.*,PT= cast(ISNULL(PID,'')+'\'+ITEM as varchar(50))FROM TB2 B LEFT JOIN Tb A ON ITEM=A.CID
UNION ALL
SELECT S.Item,GX ,Leadtime,PT= cast(ISNULL(PID,'')+'\'+PT as varchar(50)) FROM SZY S ,Tb A WHERE CHARINDEX(CID+'\', PT)>0 AND LEFT(PT,CHARINDEX('\',PT)-1)!='A'
)
select * into # from szy t where not exists(select 1 from szy where iTEM=t.ITEM and len( pt)>len(t.pt))
select Y.*,lt=dateadd(day,-n,@A)FROM (
select t.*,
n=(select sum(Leadtime) from # where (charindex( item+'\', T.pt+'\')>0 AND item!=t.item ) OR (item=t.item and gx>=t.gx))
from # t
) Y
ORDER BY ITEM
--
Item GX Leadtime PT n lt
-------------------- ---------- ----------- -------------------------------------------------- ----------- -----------------------
A 100 3 \A 4 2010-09-26 00:00:00.000
A 200 1 \A 1 2010-09-29 00:00:00.000
A1 100 3 A\A1 8 2010-09-22 00:00:00.000
A1 200 1 A\A1 5 2010-09-25 00:00:00.000
B 100 1 A\B 7 2010-09-23 00:00:00.000
B 200 2 A\B 6 2010-09-24 00:00:00.000
B1 100 2 A\A1\B1 10 2010-09-20 00:00:00.000
B2 100 2 A\A1\B2 10 2010-09-20 00:00:00.000
(8 行受影响)
drop table #
if object_id('tb') is not null drop table tb
if object_id('tb2') is not null drop table tb2
CREATE TABLE [tb]( [PID] varchar(100) NULL , [CID] varchar(100) NULL , [NUM] int NULL)
GO
--插入测试数据
INSERT INTO [tb] ([PID],[CID],[NUM])
SELECT 'A','A1','1' UNION
SELECT 'A','B','2' UNION
SELECT 'A1','B1','1' UNION
SELECT 'A1','B2','2'
GO
CREATE TABLE [tb2]( [Item] varchar(20) NULL , [GX] VARCHAR(10) NULL , [Leadtime] int NULL)
GO
--插入测试数据
INSERT INTO [tb2] ([Item],[GX],[Leadtime])
SELECT 'A','100','3' UNION
SELECT 'A','200','1' UNION
SELECT 'B','100','1' UNION
SELECT 'B','200','2' UNION
SELECT 'A1','100','3' UNION
SELECT 'A1','200','1' UNION
SELECT 'B1','100','2' UNION
SELECT 'B2','100','2'
GO
declare @A DATETIME
SET @A='2010-9-30'
;WITH SZY AS(
SELECT B.*,PT= cast(ISNULL(PID,'')+'\'+ITEM as varchar(50))FROM TB2 B LEFT JOIN Tb A ON ITEM=A.CID
UNION ALL
SELECT S.Item,GX ,Leadtime,PT= cast(ISNULL(PID,'')+'\'+PT as varchar(50)) FROM SZY S ,Tb A WHERE CHARINDEX(CID+'\', PT)>0 AND LEFT(PT,CHARINDEX('\',PT)-1)!='A'
)
select * into # from szy t where not exists(select 1 from szy where iTEM=t.ITEM and len( pt)>len(t.pt))
select t.item,t.gx,n=dateadd(day,-(select sum(Leadtime) from # where (charindex( item+'\', T.pt+'\')>0 AND item!=t.item ) OR (item=t.item and gx>=t.gx)),@A)
from # t
ORDER BY ITEM
--
item gx n
-------------------- ---------- -----------------------
A 100 2010-09-26 00:00:00.000
A 200 2010-09-29 00:00:00.000
A1 100 2010-09-22 00:00:00.000
A1 200 2010-09-25 00:00:00.000
B 100 2010-09-23 00:00:00.000
B 200 2010-09-24 00:00:00.000
B1 100 2010-09-20 00:00:00.000
B2 100 2010-09-20 00:00:00.000
(8 行受影响)
drop table #