我有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查询以实现最终结果。
非常感谢你的帮助。
答案 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