sql 游标,一条id显示在多行数据
sql 求一个游标,一条id显示在多行数据
现在有以下要求:表1:
Tableone
TableoneID orderNo Ordernumber NUB1
随机 S001 X3600000001 2
随机 S001 X3600000002 2
随机 S002 X3600000003 6
随机 S002 X3600000004 6
随机 S003 X3600000005 6
随机 S003 X3600000006 8
表2:
Tabletwo
TabletwoID orderNo Deliveryitem NUB2
随机 S001 D3600000001 4
随机 S002 D3600000002 7
随机 S003 D3600000003 8
随机 S003 D3600000004 4
随机 S003 D3600000005 2
要做成表三的形式:
MergeTable
MergeTableID orderNo Ordernumber NUB1 Deliveryitem NUB2
随机 S001 X3600000001 2 D3600000001 4
随机 X3600000002 2
随机 S002 X3600000003 6 D3600000002 7
随机 X3600000004 6
随机 S003 X3600000005 6 D3600000003 8
随机 X3600000006 8 D3600000004 4
随机 D3600000005 2
orderNo 是唯一的
表1的Ordernumber 和表2的Deliveryitem 是不确定的 要生存表三的形式;可用游标,存储过程都可以。最好是MySQL中和sql2008中实现
要完整的sql语句,谢谢!
------解决思路----------------------
------解决思路----------------------
现在有以下要求:表1:
Tableone
TableoneID orderNo Ordernumber NUB1
随机 S001 X3600000001 2
随机 S001 X3600000002 2
随机 S002 X3600000003 6
随机 S002 X3600000004 6
随机 S003 X3600000005 6
随机 S003 X3600000006 8
表2:
Tabletwo
TabletwoID orderNo Deliveryitem NUB2
随机 S001 D3600000001 4
随机 S002 D3600000002 7
随机 S003 D3600000003 8
随机 S003 D3600000004 4
随机 S003 D3600000005 2
要做成表三的形式:
MergeTable
MergeTableID orderNo Ordernumber NUB1 Deliveryitem NUB2
随机 S001 X3600000001 2 D3600000001 4
随机 X3600000002 2
随机 S002 X3600000003 6 D3600000002 7
随机 X3600000004 6
随机 S003 X3600000005 6 D3600000003 8
随机 X3600000006 8 D3600000004 4
随机 D3600000005 2
orderNo 是唯一的
表1的Ordernumber 和表2的Deliveryitem 是不确定的 要生存表三的形式;可用游标,存储过程都可以。最好是MySQL中和sql2008中实现
要完整的sql语句,谢谢!
------解决思路----------------------
--建表数据
create table #表1
(
TableoneID nvarchar(2),
orderNo varchar(20),
Ordernumber varchar(20),
NUB1 int
)
insert into #表1 values
('随机' ,'S001', 'X3600000001', 2),
('随机' ,'S001', 'X3600000002', 2),
('随机' ,'S002', 'X3600000003', 6),
('随机' ,'S002', 'X3600000004', 6),
('随机' ,'S003', 'X3600000005', 6),
('随机' ,'S003', 'X3600000006', 8)
create table #表2
(
TabletwoID nvarchar(2),
orderNo varchar(20),
Deliveryitem varchar(20),
NUB2 int
)
insert into #表2 values
('随机', 'S001', 'D3600000001', 4),
('随机', 'S002', 'D3600000002', 7),
('随机', 'S003', 'D3600000003', 8),
('随机', 'S003', 'D3600000004', 4),
('随机', 'S003', 'D3600000005', 2);
with cte as
(select ROW_NUMBER()over(partition by orderNO order by orderNo) id,* from #表1)
,cte1 as
(select ROW_NUMBER()over(partition by orderNO order by orderNo) id,* from #表2)
,cte2 as
(
select
ROW_NUMBER()over(order by (select 1)) id,
'随机' mergetabID
,ISNULL(a.orderNo,b.orderNo) orderNo
,a.Ordernumber
,a.NUB1
,b.Deliveryitem
,b.NUB2
from cte a
full join cte1 b ON b.orderNo = a.orderNo and b.id = a.id
)
select *,neworderNo=(select case when id+1 = a.id and orderNo = a.orderNo then '' else a.orderNo end from cte2 where id = a.id-1)
into #t
from cte2 a
select *,case when neworderNo is null then (select orderNo from #t where id =1) else neworderNo end from #t
------解决思路----------------------
-- SQL Server
WITH /* 测试数据
Table1(TableoneID,orderNo,Ordernumber,NUB1)AS(
SELECT NEWID(),'S001','X3600000001',2 UNION ALL
SELECT NEWID(),'S001','X3600000002',2 UNION ALL
SELECT NEWID(),'S002','X3600000003',6 UNION ALL
SELECT NEWID(),'S002','X3600000004',6 UNION ALL
SELECT NEWID(),'S003','X3600000005',6 UNION ALL
SELECT NEWID(),'S003','X3600000006',8
)
,Table2(TabletwoID,orderNo,Deliveryitem,NUB2)AS(
SELECT NEWID(),'S001','D3600000001',4 UNION ALL
SELECT NEWID(),'S002','D3600000002',7 UNION ALL
SELECT NEWID(),'S003','D3600000003',8 UNION ALL
SELECT NEWID(),'S003','D3600000004',4 UNION ALL
SELECT NEWID(),'S003','D3600000005',2
), */
t1 AS (
SELECT *,
ROW_NUMBER()OVER(PARTITION BY orderNo ORDER BY orderNumber) rn
FROM table1
)
,t2 AS (
SELECT *,
ROW_NUMBER()OVER(PARTITION BY orderNo ORDER BY Deliveryitem) rn
FROM table2
)
,t3 AS (
SELECT ISNULL(t1.orderNo,t2.orderNo) orderNo,
ISNULL(t1.rn,t2.rn) rn,
t1.Ordernumber,
t1.NUB1,
t2.Deliveryitem,
t2.NUB2
FROM t1
FULL JOIN t2
ON t1.orderNo = t2.OrderNo
AND t1.rn = t2.rn
)
SELECT NEWID() MergeTableID,
CASE WHEN rn=1 THEN orderNo ELSE NULL END orderNo,
Ordernumber,
NUB1,
Deliveryitem,
NUB2
FROM t3
ORDER BY t3.orderNo, rn
MergeTableID orderNo Ordernumber NUB1 Deliveryitem NUB2
------------------------------------ ------- ----------- ----------- ------------ -----------
251314C2-74E3-4694-8851-A72534EF9CD7 S001 X3600000001 2 D3600000001 4
244F7509-5275-49C2-89FC-6DA58B69DC10 NULL X3600000002 2 NULL NULL
2D984B1F-8E75-47EB-BF56-28B357454BAB S002 X3600000003 6 D3600000002 7
8E4194A0-6502-482B-BC69-C16E733A9BCF NULL X3600000004 6 NULL NULL
35677FDF-19BB-4002-94A5-FC9F3389902F S003 X3600000005 6 D3600000003 8
B25E87A8-DED9-466F-BE5A-A16AB24311BC NULL X3600000006 8 D3600000004 4
3646C166-C1F2-4C06-90C5-75760567495A NULL NULL NULL D3600000005 2