2015-01-06 3 views
1

고객 ID와 판매 ID를 연결하는 테이블이 있습니다. 여러 고객을 동일한 판매 ID에 연결할 수 있지만 첫 번째 고객은 'M'유형의 주 고객이어야합니다. 다른 모든 고객은 기타 ('O')를 입력해야합니다. 내가 할 수있을하고자하는 어떤동일한 식별자에 속하는 레코드를 찾고 열에 여러 값이 있는지 확인하십시오.

Cust_ID Sale_ID Cust_Type 
1   123  'M' 
2   123  'M' 
3   123  'O' 

가 돌려 주어 : 정확하지 않습니다 - 같은 판매 ID에 연결

Cust_ID Sale_ID Cust_Type 
1   123  'M' 
2   123  'O' 
3   124  'M' 
4   125  'M' 
5   125  'O' 
6   125  'O' 

때로는 여러 고객은 홈페이지 ('M') 고객이 될 것입니다 판매 ID의 고객 중 2 명 이상이 주요 고객 인 고객 ID, 판매 ID 및 고객 유형 목록. 나는. Main ('M')은 동일한 판매 ID가있는 행에서 두 번 이상 발생합니다.

도움을 주시면 대단히 감사하겠습니다.

답변

3

그래서, 문제는 sales_id 하나 개 이상의 M 값을 가질 수 있고 당신이 이것을 감지 할 것입니다. 나는 그 값을 계산하는 윈도우 함수를 사용하여이 문제를 접근하는 것입니다 : 주요 고객을 누락 또한 중요 할 수 있기 때문에

select t.* 
from (select t.*, 
      sum(case when cust_type = 'M' then 1 else 0 end) over (partition by sales_id) as NumMs 
     from table t 
    ) t 
where NumMs > 1; 

사실, 난, 조건 NumMs <> 1을 사용합니다.

+0

절대적으로 완벽합니다! 도와 주셔서 정말 감사합니다. 주요 고객을 놓친 것에 대한 귀하의 충고는 바로 그 표시에있었습니다. – winchesterau

0

이게 무슨 뜻이야? 이는 창 함수를 사용하여 수행 할 수 있습니다. 이것에 대해

CREATE TABLE temp(
    Cust_ID INT, 
    Sale_ID INT, 
    Cust_Type VARCHAR(1) 
) 
INSERT INTO temp VALUES 
(1, 123, 'M'), 
(2, 123, 'M'), 
(3, 124, 'M'), 
(4, 125, 'M'), 
(5, 125, 'O'), 
(6, 125, 'O'); 


WITH CTE AS(
    SELECT *, cc = COUNT(*) OVER(PARTITION BY Sale_ID) 
    FROM temp 
    WHERE Cust_Type = 'M' 
) 
SELECT 
    Cust_ID, 
    Sale_ID, 
    Cust_Type 
FROM CTE 
WHERE cc > 1 

DROP TABLE temp 
0

방법은 :

SELECT s.Cust_ID, s.Sale_ID, s.Cust_Type 
FROM StackOverflow s INNER JOIN 
    (SELECT Sale_ID 
    FROM StackOverflow 
    WHERE Cust_Type = 'M' 
    GROUP BY Sale_ID 
    HAVING COUNT(*) > 1) as Multiples ON s.Sale_ID = Multiples.Sale_ID 
관련 문제