如何在不使用游标或循环的情况下拉出数据集组合Header表和Details表

时间:2018-03-12 02:39:23

标签: sql sql-server sql-server-2008 tsql sql-server-2012

我有2个表订单订单明细表。我想将表数据与数据集中的标题和详细信息组合在一起。当我加入这两个表时,我得到组合数据,但我想要一个模式首先拉出标题然后接下来的细节而不使用循环或游标。 以下是下面描述的示例:

订购表:

OrderID  Orderdate  customerF_name  customerL_name OrderAmount
1001     2/21/2018  abc             def            $3,025
1002     2/21/2018  ghi             jkl            $7,226
1003     2/21/2018  mno             pqr            $5,752

订购详情表:

OrderID  Item       Item_Desc         Item_Amount Quantity
1002     sofa       leather sofa.     $1,900         1
1002     bed        bedset              $800         1
1002     desser     desser              $780         1
1002     dining     120" table..      $3,746         1
1001     cocktail   cocktail tbl set  $1,780         1
1001     Bedset     double bed set    $1,245         1

预期输出:

1001,2/21/2018,abc,def,3,025
1001,cocktail,cocktail tbl set,1,780,1
1001,Bedset,double bed set,1,245,1
1002,2/21/2018,ghi,jkl,7,226,1
1002,sofa,leather sofa.,1,900,1
1002,bed,bedset,800,1
1002,desser,desser,780,1
1002,dining,120" table..,3,746,1

您可能已观察到输出中的模式。每个OrderID的第一行从Header表中提取,然后是相同orderId的详细信息。此模式将重复,直到Header表的最后一行。

我正在尝试创建一个查询以在我的SSIS ETL过程中生成一个平面文件,并将平面文件发送给需要的用户。

有人可以帮我解决如何编写MS-SQL查询以实现最终结果。

非常感谢你的帮助。

5 个答案:

答案 0 :(得分:1)

联合查询可能会起作用。我会输出一些东西来展示一般的想法。它不会是完美的。

select orderId + ',' + firstName + ','
    + LastName + ',' + cast(orderAmount as varchar(10)) row
union
select orderId + ',' + item + ',' + itemDescription + ','
    + Cast(ItemAmount as varchar (50) )+ ',' + cast (quantity as varchar(10)) row

order by row

答案 1 :(得分:1)

Select orderid,col2, col3,...,col100 FROM
 (
SELECT orderid,col2, col3,...,col100,1 as Seq from header_table
UNION ALL
SELECT orderid,col2, col3,...,col100,2 as Seq from detail_table
) ORDER BY orderid,Seq 

答案 2 :(得分:1)

尝试以下方法:

--ORDER TABLE:
Declare @order table(OrderID int,  Orderdate varchar(10), customerF_name varchar(100),  customerL_name varchar(100), OrderAmount money)
insert into @order select 1001,     '2/21/2018',  'abc',             'def',            '$3,025'
insert into @order select 1002,     '2/21/2018',  'ghi',             'jkl',            '$7,226'
insert into @order select 1003,     '2/21/2018',  'mno',             'pqr',            '$5,752'

--ORDER DETAILS TABLE:

declare @order_detail table (OrderID int,  Item varchar(100),      Item_Desc varchar(100),  Item_Amount money, Quantity int)
insert into @order_detail select 1002     ,'sofa     ',  'leather sofa.    ', '$1,900' ,        1
insert into @order_detail select 1002     ,'bed      ',  'bedset           ', '  $800' ,        1
insert into @order_detail select 1002     ,'desser   ',  'desser           ', '  $780' ,        1
insert into @order_detail select 1002     ,'dining   ',  '120" table..     ', '$3,746' ,        1
insert into @order_detail select 1001     ,'cocktail ',  'cocktail tbl set ', '$1,780' ,        1
insert into @order_detail select 1001     ,'Bedset   ',  'double bed set   ', '$1,245' ,        1

declare @output_table table (Col1 varchar(100), Col2 varchar(100), Col3 varchar(100), Col4 varchar(100) ,Col5 varchar(100))
insert into @output_table
select * from @order where OrderId in (select distinct o.OrderId from @order o join @order_detail od on od.OrderId = o.OrderId)

insert into @output_table
select * from @order_detail where OrderId in (select distinct o.OrderId from @order o join @order_detail od on od.OrderId = o.OrderId)
select * from @output_table order by 1

答案 3 :(得分:1)

试试这个:

select * from (
    select OrderId, CAST(orderdate as varchar(20)) [orderdate], customerF_name, customerL_name, CAST(orderAmount as varchar(15)) [orderAmount] from ORDER_TABLE
    union all
    select orderId, item, item_desc, CAST(item_amount as varchar(15)), CAST(quantity as varchar(5)) from ORDER_DETAILS_TABLE
) a order by orderId, [orderDate]

因为你在各自的列中有不同的数据类型,你必须使用cast:)

答案 4 :(得分:0)

而不是破解数据,为什么不只是做一个连接

select o.*, d.Item, d.Desc, d.Amount, d.Quantity
  from order  o
  join detail d
    on o.OrderID = d.OrderID 
 order 
    by o.OrderID, d.Item