sql已经完成,生成表
sql已经完成,生成表
街头要饭 发表于3年前
sql已经完成,生成表
  • 发表于 3年前
  • 阅读 213
  • 收藏 1
  • 点赞 0
  • 评论 13

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: sql2008 两张表合成一张表,并且特定排序,遇到一列中有相同字段,只显示第一个字段,下一字段留空。。。
 



create table tableone
(
    TableoneID varchar(50),
    orderNo varchar(20),
    Ordernumber varchar(20),
    NUB1 int
) 
insert into tableone values
(NEWID()       ,'S001',    'X3600000001',    2),
(NEWID()          ,'S001',    'X3600000002',    2),
( NEWID()           ,'S002',    'X3600000003',    6),
( NEWID()           ,'S002',    'X3600000004',    6),
(NEWID()           ,'S003',    'X3600000005',    6),
(NEWID()           ,'S003',    'X3600000006',    8)

create table  tabletwo
(
    TabletwoID varchar(50),
    orderNo varchar(20),
    Deliveryitem varchar(20),
    NUB2 int
)
insert into tabletwo values
(NEWID(),           'S001',    'D3600000001',    4),
(NEWID(),           'S002',    'D3600000002',    7),
(NEWID(),           'S003',    'D3600000003',    8),
(NEWID(),            'S003',    'D3600000004',    4),
(NEWID(),            'S003',    'D3600000005',    2);

-- 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 tableone
)
,t2 AS (
    SELECT *,
           ROW_NUMBER()OVER(PARTITION BY orderNo ORDER BY Deliveryitem) rn
      FROM tabletwo
)
,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


以上内容在sql2008中实现,为了效率就没用游标

共有 人打赏支持
粉丝 3
博文 25
码字总数 14470
评论 (13)
开源中国首席问题男
select * from sheet1 left join sheet2 on sheet1.订单编号=sheet2.订单编号
街头要饭

引用来自“开源中国首席问题男”的评论

select * from sheet1 left join sheet2 on sheet1.订单编号=sheet2.订单编号

我试过了 不行
开源中国首席问题男

引用来自“街头要饭”的评论

引用来自“开源中国首席问题男”的评论

select * from sheet1 left join sheet2 on sheet1.订单编号=sheet2.订单编号

我试过了 不行

请问报错报什么?
街头要饭

引用来自“开源中国首席问题男”的评论

引用来自“街头要饭”的评论

引用来自“开源中国首席问题男”的评论

select * from sheet1 left join sheet2 on sheet1.订单编号=sheet2.订单编号

我试过了 不行

请问报错报什么?

不报错 达不到要求,我把执行结果也给你看看吧待会哈
街头要饭

引用来自“开源中国首席问题男”的评论

引用来自“街头要饭”的评论

引用来自“开源中国首席问题男”的评论

select * from sheet1 left join sheet2 on sheet1.订单编号=sheet2.订单编号

我试过了 不行

请问报错报什么?

@开源中国首席问题男 看到了吗
Czhipu
  --创建临时表sheet3,表列如第三个表格

  DECLARE Cur CURSOR FOR
  --查询sheet 得到订单编号
  OPEN Cur
  FETCH NEXT FROM Cur INTO 订单编号
  WHILE @@FETCH_STATUS = 0
  BEGIN
    -- BEGIN
    --根据订单编号查询sheet1
    --插入到临时表sheet3

    FETCH NEXT FROM Cur INTO 订单编号
  END
  CLOSE Cur
  DEALLOCATE Cur

  --查询sheet3
  DROP TABLE sheet3

  --ps 数据量大的话,用游标效率很低
Czhipu
  --创建临时表sheet3,表列如第三个表格

  DECLARE Cur CURSOR FOR
  --查询sheet2 得到订单编号
  OPEN Cur
  FETCH NEXT FROM Cur INTO 订单编号
  WHILE @@FETCH_STATUS = 0
  BEGIN
    -- BEGIN
    --根据订单编号查询sheet1
    --插入到临时表sheet3

    FETCH NEXT FROM Cur INTO 订单编号
  END
  CLOSE Cur
  DEALLOCATE Cur

  --查询sheet3
  DROP TABLE sheet3

  --ps 数据量大的话,用游标效率很低
街头要饭

引用来自“zhipu”的评论

  --创建临时表sheet3,表列如第三个表格

  DECLARE Cur CURSOR FOR
  --查询sheet 得到订单编号
  OPEN Cur
  FETCH NEXT FROM Cur INTO 订单编号
  WHILE @@FETCH_STATUS = 0
  BEGIN
    -- BEGIN
    --根据订单编号查询sheet1
    --插入到临时表sheet3

    FETCH NEXT FROM Cur INTO 订单编号
  END
  CLOSE Cur
  DEALLOCATE Cur

  --查询sheet3
  DROP TABLE sheet3

  --ps 数据量大的话,用游标效率很低
我试试
街头要饭

引用来自“zhipu”的评论

  --创建临时表sheet3,表列如第三个表格

  DECLARE Cur CURSOR FOR
  --查询sheet2 得到订单编号
  OPEN Cur
  FETCH NEXT FROM Cur INTO 订单编号
  WHILE @@FETCH_STATUS = 0
  BEGIN
    -- BEGIN
    --根据订单编号查询sheet1
    --插入到临时表sheet3

    FETCH NEXT FROM Cur INTO 订单编号
  END
  CLOSE Cur
  DEALLOCATE Cur

  --查询sheet3
  DROP TABLE sheet3

  --ps 数据量大的话,用游标效率很低
好像不给力啊,能给出具体写法吗?
霍啸林
有点挑战性16
街头要饭

引用来自“霍啸林”的评论

有点挑战性16
你试试?
霍啸林
通过视图或临时表给sheet1和sheet2各加一列SeqNo,
ROW_NUMBER() OVER(PARTITION BY 订单编号 ORDER BY 货号,数量) AS SeqNo
假定加了SeqNo列的两个sheet分别为s1和s2
SELECT ... FROM s1 FULL OUTER JOIN s2 ON
(s1.订单编号 = s2.订单编号 AND s1.SeqNo = s2.SeqNo)
我用的是SqlServer,你若是其他db,自己看着改吧
街头要饭

引用来自“霍啸林”的评论

通过视图或临时表给sheet1和sheet2各加一列SeqNo,
ROW_NUMBER() OVER(PARTITION BY 订单编号 ORDER BY 货号,数量) AS SeqNo
假定加了SeqNo列的两个sheet分别为s1和s2
SELECT ... FROM s1 FULL OUTER JOIN s2 ON
(s1.订单编号 = s2.订单编号 AND s1.SeqNo = s2.SeqNo)
我用的是SqlServer,你若是其他db,自己看着改吧
具体写法 理论的我也不懂,我不是做sql了;受累受累
×
街头要饭
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: