我需要列出与每个客户完成的所有订单,因此,如果某个客户已经通过了6个订单,那么我们需要列出订单1 | Order2 | order3 | ......
我有一个名为Order的表,我们有客户端ID,我使用SqlServer 2008 R2,我尝试了不同的方法但没有成功,它们一直运行并且从未给出结果:s,这里我的lates尝试:
SELECT convert(varchar(1),isnull(user.Order.OrderId,'')) +' | '+ convert(varchar(1),isnull(Order_1.OrderId,'')) +' | '+convert(varchar(1),isnull(Order_2.OrderId,'')) +' | '+convert(varchar(1),isnull(Order_3.OrderId,'')) +' | '+convert(varchar(1),isnull(Order_4.OrderId,'')) +' | '+convert(varchar(1),isnull(Order_5.OrderId,'')) as OrderIdList,
user.client.kdnr
FROM user.Order
left outer JOIN user.Order AS Order_1 ON user.Order.clientnr = Order_1.clientnr AND Order_1.OrderId <> user.Order.OrderId and Order.orderDate < Order_1.orderDate
left outer JOIN user.Orderold AS Order_2 ON user.Order.clientnr = Order_2.clientnr AND Order_2.OrderId not in ( user.Order.OrderId , Order_1.OrderId ) and Order_1.orderDate < Order_2.orderDate
left outer JOIN user.Orderold AS Order_3 ON user.Order.clientnr = Order_3.clientnr AND Order_3.OrderId not in ( user.Order.OrderId , Order_1.OrderId, Order_2.OrderId ) and Order_1.orderDate < Order_2.orderDate
left outer JOIN user.Orderold AS Order_4 ON user.Order.clientnr = Order_4.clientnr AND Order_4.OrderId not in ( user.Order.OrderId , Order_1.OrderId, Order_2.OrderId, Order_3.OrderId ) and Order_2.orderDate < Order_3.orderDate
left outer JOIN user.Orderold AS Order_5 ON user.Order.clientnr = Order_5.clientnr AND Order_5.OrderId not in ( user.Order.OrderId , Order_1.OrderId, Order_2.OrderId, Order_3.OrderId, Order_4.OrderId ) and Order_3.orderDate < Order_4.orderDate
INNER JOIN user.client ON Order_1.clientnr = user.client.kdnr
group by client.kdnr ,user.client.name1, user.client.firstname, user.Order.OrderId, Order_1.OrderId,Order_1.Ordernr,Order_2.OrderId ,Order_3.OrderId,Order_4.OrderId,Order_5.OrderId `
是否有任何身体有dea我怎么能正确地做到这一点?
答案 0 :(得分:1)
通过SQL Server 2005及更高版本的使用XML功能,您可以轻松高效地生成逗号分隔值。
尝试此操作(根据您的表名和列名进行调整):
-- Sample tables
declare @Customer table
(
CustomerId int,
Name varchar(50)
)
declare @Order table
(
OrderId int,
CustomerId int
)
-- Sample data
insert into @Customer (CustomerId, Name) values (1, 'Alice')
insert into @Customer (CustomerId, Name) values (2, 'Mary')
insert into @Customer (CustomerId, Name) values (3, 'David')
insert into @Order (OrderId, CustomerId) values (1, 1)
insert into @Order (OrderId, CustomerId) values (2, 1)
insert into @Order (OrderId, CustomerId) values (3, 1)
insert into @Order (OrderId, CustomerId) values (4, 2)
insert into @Order (OrderId, CustomerId) values (5, 2)
insert into @Order (OrderId, CustomerId) values (6, 3)
----select * from @Customer
----select * from @Order
/* Actual Query that would add the OrderId from @Order table as a comma separated list against relevant Customer */
SELECT Customer.CustomerId as CustomerId, Customer.Name,
(
SELECT Convert(varchar(1), O.OrderId) + ','
FROM @Order AS O
WHERE O.CustomerId = Customer.CustomerId
ORDER BY O.OrderId
FOR XML PATH('')
) AS OrderList
FROM @Customer AS Customer
答案 1 :(得分:0)
好吧,我不能给你一个完整的答案,但我可以告诉你如何解决它。尝试使用公用表表达式(http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx)。
有了这个,你可以加入你自己的结果集,在那里你做一个递归循环来解决这个问题。
希望它可以帮到你