Reputation: 28248
I need to get a list of Customers who have never had an Order Exported
I am passing in a list of CustomerNumbers, grab them join on Orders then I am grouping - I feel like I am close but not sure how to get just Customers where none of the Orders.Exported is set to 1.
Here is what I have so far:
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
This almost gets me what I need, my results for this are:
CustomerID Exported OrderCount
375408 NULL 1
375408 1 5
375412 1 2
376892 NULL 1
So out of this list I would only want 376892 because they have never had an Order exported before
Upvotes: 1
Views: 49
Reputation: 33839
You could use Having Min(IsNull(Orders.Exported,0))
with a Left Join
and remove grouping by Orders.Exported
to filter out customers who has exported orders before.
Logically your count will always be 0 and so you don't need to count.
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
Upvotes: 1
Reputation: 14726
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
Upvotes: 0
Reputation: 99
WHERE Customers.CustomerNumber IN (SELECT * FROM dbo.Split(REPLACE(@CustomerNumbers,'\',''),','))
AND Customers.ManufacturerID=@ManufacturerID
AND Customers.Source = 'ipad'
AND Orders.Exported is NuLL
Upvotes: 0