1

我需要获取从未导出过订单的客户列表

我正在传递一个 CustomerNumbers 列表,将它们加入 Orders 然后我进行分组 - 我觉得我很接近但不知道如何只获得没有 Orders.Exported 设置为 1 的客户。

这是我到目前为止所拥有的:

SELECT Customers.CustomerID,
       Orders.Exported,
       Count(Orders.OrderID) AS OrderCount
FROM Customers WITH (Nolock)
JOIN Orders ON Customers.ManufacturerID = Orders.ManufacturerID
AND Customers.CustomerNumber = Orders.CustomerNumber
WHERE Customers.CustomerNumber IN (
  SELECT *
  FROM dbo.Split(REPLACE(@CustomerNumbers,'\',''),','))
  AND Customers.ManufacturerID=@ManufacturerID
  AND Customers.Source = 'ipad'
GROUP BY Customers.CustomerID,
         Orders.Exported

这几乎让我得到了我需要的东西,我的结果是:

CustomerID  Exported    OrderCount
375408      NULL         1
375408      1            5
375412      1            2 
376892      NULL         1

所以在这个列表中我只想要 376892 因为他们以前从未导出过订单

4

3 回答 3

1

您可以使用Having Min(IsNull(Orders.Exported,0)) with aLeft Joinremove grouping by Orders.Exported来过滤掉之前已导出订单的客户。

从逻辑上讲,您的计数将始终为 0,因此您无需计数。

SELECT Customers.CustomerID, Min(IsNull(Orders.Exported,0)) Exported, Count(Orders.OrderID) As OrderCount
FROM Customers With (Nolock) LEFT JOIN Orders 
    ON Customers.ManufacturerID = Orders.ManufacturerID AND 
       Customers.CustomerNumber = Orders.CustomerNumber
WHERE Customers.CustomerNumber IN (
         SELECT colName FROM dbo.Split(REPLACE(@CustomerNumbers,'\',''),',')) AND 
         Customers.ManufacturerID=@ManufacturerID AND Customers.Source = 'ipad' 
GROUP BY Customers.CustomerID 
HAVING Min(IsNull(Orders.Exported,0)) = 0
于 2013-10-21T11:19:45.710 回答
0
WITH CustomersWithExportedOrders AS (
    SELECT Customers.CustomerNumber
    FROM Customers
         INNER JOIN Orders
             ON Customers.ManufacturerID = Orders.ManufacturerID 
                AND Customers.CustomerNumber = Orders.CustomerNumber
    WHERE Orders.Exported IS NOT NULL
)
SELECT Customers.CustomerID
     , Orders.Exported
     , Count(Orders.OrderID) As OrderCount
FROM Customers 
     INNER JOIN Orders 
         ON Customers.ManufacturerID = Orders.ManufacturerID 
            AND Customers.CustomerNumber = Orders.CustomerNumber
WHERE Customers.CustomerNumber IN (SELECT * 
                                   FROM dbo.Split(REPLACE(@CustomerNumbers, '\', ''), ','))
      AND Customers.ManufacturerID = @ManufacturerID
      AND Customers.CustomerNumber NOT IN (SELECT CustomerNumber 
                                           FROM CustomersWithExportedOrders)
      AND Customers.Source = 'ipad' 
GROUP BY Customers.CustomerID
        , Orders.Exported
于 2013-10-21T11:24:11.150 回答
0
WHERE Customers.CustomerNumber IN (SELECT * FROM dbo.Split(REPLACE(@CustomerNumbers,'\',''),','))
    AND Customers.ManufacturerID=@ManufacturerID
    AND Customers.Source = 'ipad' 
    AND Orders.Exported is NuLL
于 2013-10-21T11:17:12.890 回答