Finding customers with identical orders

前端 未结 3 1366
[愿得一人]
[愿得一人] 2021-01-03 11:24

I need to find customers who have made identical orders. (Using T-SQL)

Order

OrderID Customerer  
1   2   
2   5   
3   6            


        
3条回答
  •  时光取名叫无心
    2021-01-03 11:53

    Here's one way.

    SELECT  O1.OrderID ,
            O1.Customer ,
            O2.OrderID ,
            O2.Customer
    FROM    [Order] O1
            JOIN [Order] O2 ON O1.OrderID < O2.OrderID
                               AND O1.Customer <> O2.Customer
    WHERE   NOT EXISTS ( SELECT Quantity ,
                                Reference
                         FROM   OrderLine
                         WHERE  O1.OrderID = OrderLine.OrderID
                         EXCEPT
                         SELECT Quantity ,
                                Reference
                         FROM   OrderLine
                         WHERE  O2.OrderID = OrderLine.OrderID )
            AND NOT EXISTS ( SELECT Quantity ,
                                    Reference
                             FROM   OrderLine
                             WHERE  O2.OrderID = OrderLine.OrderID
                             EXCEPT
                             SELECT Quantity ,
                                    Reference
                             FROM   OrderLine
                             WHERE  O1.OrderID = OrderLine.OrderID )
    

    You can also use XML PATH to simulate GROUP_CONCAT then JOIN the two result sets

    DECLARE @T TABLE
        (
          OrderId INT PRIMARY KEY,
          Customer INT ,
          complete_order VARCHAR(MAX)
        )  
    
        INSERT  INTO @T
                SELECT  *
                FROM    [Order] O
                        CROSS APPLY ( SELECT    CAST(Quantity AS VARCHAR(30))
                                                + '~' + Reference + '~~'
                                      FROM      OrderLine OL
                                      WHERE     OL.OrderID = O.OrderID
                                      ORDER BY  Reference ,
                                                Quantity
                                    FOR
                                      XML PATH('')
                                    ) T ( complete_order )
    
    SELECT  T1.OrderId, 
            T1.Customer
    FROM    @T T1
    WHERE   EXISTS ( SELECT *
                     FROM   @T T2
                     WHERE  T1.Customer <> T2.Customer
                            AND T1.OrderId <> T2.OrderId
                            AND T1.complete_order = T2.complete_order )
    

提交回复
热议问题