34,588
社区成员
发帖
与我相关
我的任务
分享
use Tempdb
go
--> -->
declare @A table([id] int,[编号] nvarchar(4),[数量] int)
Insert @A
select 1,N'A001',4 union all
select 2,N'A002',2
declare @B table([id] int,[编号] nvarchar(4),[姓名] nvarchar(10))
Insert @B
select 1,N'A001',N'张三' union all
select 2,N'A001',N'李四' union all
select 3,N'A002',N'王五'
SELECT 编号,数量,姓名
FROM
(
SELECT a.编号,数量=1,b.姓名,b.ID FROM @B AS b,@A AS a WHERE a.编号=b.编号
UNION ALL
SELECT a.编号,a.数量-b.数量,b.姓名,ID=b.ID+1
FROM @A AS a
LEFT JOIN (SELECT 编号,姓名='空白',COUNT(*) AS 数量,ISNULL(MAX(ID),0)+1 AS ID FROM @B GROUP BY 编号) AS b ON a.编号=b.编号
WHERE b.数量 IS NULL OR b.数量<a.数量
)T
ORDER BY 编号,ID
/*
编号 数量 姓名
A001 1 张三
A001 1 李四
A001 2 空白
A002 1 王五
A002 1 空白
*/
SELECT 编号,数量, 姓名
FROM
(
SELECT a.编号,数量=1,b.姓名,b.ID FROM B,A WHERE a.编号=b.编号
UNION ALL
SELECT a.编号,b.数量-a.数量,b.姓名,ID=a.数量+1
FROM A
LEFT JOIN (SELECT 编号,姓名='空白',COUNT(*) AS 数量 FROM B GROUP BY 编号) AS b ON a.编号=b.编号
WHERE b.数量 IS NULL OR b.数量<a.数量
)T
ORDER BY 编号,ID
[/quote]
这种方法有个问题,假如A003 规定有2个人,表B中无记录,
这时候,应该出来一条数据 A003 2 空
但按照您的方法,出来2条数据
A003 1 空
A003 空 空SELECT 编号,数量, 姓名
FROM
(
SELECT a.编号,数量=1,b.姓名,b.ID FROM B,A WHERE a.编号=b.编号
UNION ALL
SELECT a.编号,b.数量-a.数量,b.姓名,ID=a.数量+1
FROM A
LEFT JOIN (SELECT 编号,姓名='空白',COUNT(*) AS 数量 FROM B GROUP BY 编号) AS b ON a.编号=b.编号
WHERE b.数量 IS NULL OR b.数量<a.数量
)T
ORDER BY 编号,ID
SELECT 编号,数量, 姓名
FROM
(
SELECT a.编号,a.数量,b.姓名,b.ID FROM B,A WHERE a.编号=b.编号
UNION ALL
SELECT a.编号,a.数量,b.姓名,ID=a.数量+1
FROM A
LEFT JOIN (SELECT 编号,姓名='空白',COUNT(*) AS 数量 FROM B GROUP BY 编号) AS b ON a.编号=b.编号
INNER JOIN master.dbo.spt_values AS c ON c.type='P' AND c.number<b.数量-ISNULL(a.数量,0)
WHERE b.数量 IS NULL OR b.数量<a.数量
)T
ORDER BY 编号,ID