2016-10-15 44 views
1

我不确定如何实现此目的。我希望获得具有“ProductA”的人员,但不能拥有“ProductA”和“ProductB”的人员。T-SQL如果人员有产品A但不能同时选择A和B

预期输出:

CustomerID | Product 
-------------------- 
     1 | ProductA 
     2 | ProductA 
     3 | ProductA 
     6 | ProductA 
     7 | ProductA 

表:

CREATE TABLE #TempTable 
(
    CustomerID INT, 
    Product VARCHAR(50) 
) 

INSERT INTO #TempTable (CustomerID, Product) 
VALUES 
    ('1', 'ProductA'), 
    ('2', 'ProductA'), 
    ('3', 'ProductA'), 
    ('4', 'ProductA'), 
    ('4', 'ProductB'), 
    ('6', 'ProductA'), 
    ('7', 'ProductA'); 

回答

2

我将在每一个客户在这里使用条件聚集,只是检查一个顾客买A至少一次,但没有B

SELECT CustomerID 
FROM #TempTable 
GROUP BY CustomerID 
HAVING SUM(CASE WHEN Product = 'ProductA' THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN Product = 'ProductB' THEN 1 ELSE 0 END) = 0 
+0

@Joni这是正确的答案。它将允许其他组合。 –

0

分组由CustomerID您可以检查是否最小和最大可用Product是一样的,这应该是你要找的人,其实,“产品A”:

SELECT 
    CustomerID, 
    min(Product) 
FROM TempTable 
GROUP BY CustomerID 
HAVING 1=1 
    AND min(Product) = 'ProductA' 
    AND max(Product) = 'ProductA' 
; 
0
SELECT C1.CustomerID 
FROM #TempTable C1 
LEFT JOIN #TempTable C2 
ON C2.ID = C1.ID 
AND C2.Product = 'ProductB' 
where C2.ID is null 
AND C1.Product = 'ProductA' 
0

使用PIVOT:

WITH CTE 
AS 
(
    Select CustomerID, [ProductA], [ProductB] from #TempTable 
    PIVOT 
    (
    MAX(Product) FOR Product IN ([ProductA], [ProductB]) 
    ) p 
    WHERE [ProductB] IS NULL 
) 
Select CustomerID, [ProductA] as Product 
from CTE 
相关问题