2017-04-21 1 views
0

테이블이 아래 있습니다 - 테이블에 고객 키와 역할이 채워져 있습니다. 각 고객 키에는 연관된 여러 역할이있을 수 있으며 특정 역할 목록으로 고객 키를 식별 할 수 있기를 원합니다. 예를 들어 모든 역할 ("A", "B", "C")을 가진 계정을 식별 할 수 있기를 원합니다.Microsoft SQL Server 2014 - 자체 가입으로 데카르트 결과를 방지 할 수 없습니다.

+--------------+------------+----+ 
| customer_key | sales_role | | 
+--------------+------------+----+ 
|   123 | A   | | 
|   123 | B   | | 
|   123 | C   | | 
|   456 | A   | | 
|   456 | B   | | 
|   789 | A   | | 
|   789 | B   | | 
|   789 | C   | | 
|   987 | A   | | 
|   987 | B   | | 
|   987 | C   | | 
|   987 | D   | | 
|   654 | E   | | 
|   654 | F   | | 
|    | Te<br />st | 45 | 
+--------------+------------+----+ 

내가 성공이 역할에 계정을 확인하기 위해 아래 쿼리를 사용 했어 :

SELECT 
c.customer_key 
,COUNT(c.sales_role) as 'count' 
FROM 
    table a 
    INNER JOIN table b ON a.customer_key=b.customer_key  
    RIGHT JOIN table c ON c.customer_key=a.customer_key 
WHERE 
    a.sales_role = 'A' AND 
    b.sales_role = 'B' 
GROUP BY c.customer_key 
HAVING 
    COUNT(c.sales_role) = 2 

가 위의 쿼리가 '456'customer_key 내게 줄 것이다.

그러나 아래 쿼리로 더 많은 역할을 식별하기 위해 더 많은 조인을 추가하려고하면 데카르트 제품이 생깁니다.

SELECT 
e.customer_key 
,COUNT(e.sales_role) as 'count' 
FROM 
    table a 
    INNER JOIN table b ON a.customer_key=b.customer_key  
    INNER JOIN table c ON a.customer_key=c.customer_key 
    INNER JOIN table d ON a.customer_key=d.customer_key 
    RIGHT JOIN table e ON e.customer_key=a.customer_key 
WHERE 
    a.sales_role = 'A' 
    AND b.sales_role = 'B'  
    AND c.sales_role = 'C' 


GROUP BY e.customer_key 
HAVING 
    COUNT(e.sales_role) = 3 

여기에 어떤 다른 도움을 주어야할지 모르겠다.

답변

2

당신이 필요로하는 무엇을해야합니까, 다중 연결을 필요로하지 않는이 질의 :

SELECT 
a.customer_key 
,COUNT(DISTINCT a.sales_role) as 'count' 
FROM table a 
WHERE a.sales_role IN ('A', 'B') 
GROUP BY a.customer_key 
HAVING 
    COUNT(DISTINCT a.sales_role) = 2 

당신이 A, B 및 C를 확인할 필요에 따라 IN과 HAVING 문을 변경해야

.

찾고있는 값만있는 레코드를 반환해야하는 경우 다른 역할이 있는지 테스트하고 제외 할 쿼리를 수정해야합니다. 이것은 다음과 같이 할 수 있습니다 :

+0

대단히 감사합니다. 트릭을 완료 한 것으로 보입니다. 쿼리의 NOT EXISTS 부분을 설명해 주시겠습니까? – raidboss

+0

물론입니다. 특정 customer_key 값이 찾고있는 판매 역할과 일치하는 것으로 확인되면 NOT EXISTS 내의 쿼리는 해당 고객에게 할당 된 다른 판매 역할이 있는지 확인합니다. NOT EXISTS()는 해당 쿼리에서 아무것도 발견되지 않으면 TRUE를 반환하고 해당 쿼리와 일치하는 행이 있으면 FALSE를 반환합니다. "이 쿼리에서 행이 반환되지 않으면 TRUE를보고하고 그렇지 않으면 FALSE를보고합니다"와 같이 읽을 수 있습니다. –

+0

매우 철저한 설명, 다시 한 번 감사드립니다 :) – raidboss

0

아래 쿼리를 조정하여 세고 싶은 sale_roles 조합을 세어보십시오. 시도해보십시오.

SELECT Customer_Key 
    , SUM(CASE Sales_Role WHEN 'A' THEN 1 
         WHEN 'B' THEN 1 
         WHEN 'C' THEN 1 
          ELSE 0 END) CntABC 
    , SUM(CASE Sales_Role WHEN 'A' THEN 1 
         WHEN 'B' THEN 1    
          ELSE 0 END) CntAB 
    , SUM(CASE Sales_Role WHEN 'E' THEN 1 
      ELSE 0 END) CntE 
FROM table 
GROUP BY Customer_Key 
관련 문제