2017-12-21 18 views
0

내 제목은 약간 모호하지만 아래에서 설명하려고합니다.논리/조건이있는 왼쪽 결합

두 개의 조인으로 뷰 (A)를 만들었습니다. 다른 뷰 (B)와 뷰를 결합하려고합니다. 두보기에는 연도 필드, 회사 ID, 업종 ID 및 A가 포함되어 있습니다. I 또는 U 값을 갖는 제품 코드입니다.

뷰 B에는 모든 회사의 직원 ID가 자연히 포함되어 있습니다. 신분증. 모든 종업원 ID는 I, U 또는 둘 다인 제품 코드를 가질 수 있습니다. 두 가지 모두있는 경우 생산 코드에서 식별되는 동일한 직원 ID가 두 개 있습니다.

이제 연도, 고객 ID, 업종 ID 및 제품 코드에서보기 A에 가입하려고합니다. 그러나 B보기의 모든 고객 ID가 두 번 발생할 수 있기 때문에 (해당 고객의 기본 직원이 제품 코드 I과 U를 모두 가지고있는 경우) 한 번만 가입하고 싶습니다.

I 및 NOT U : 165'370

U와 NOT 내가 : 45'27

U와 I : 48'920

은 제품 코드에 대한 고객 ID의 분포
left join [raw].[ViewA] a on a.year=b.year and a.CustomerID=b.CustomerID 
and a.IndustryID=b.IndustryID and a.ProductCode ='I' 

가 나는의 CustomerID는 제품 코드가 난 단지 고객 ID 당 한 번만 가입하려는 이유를 (U)가 모든 레코드를 제외하고있어 비록 내가 현재 실행하고있어 가입되어/Year/IndustryID는 나중에 View A의 다른 값을 집계하기 때문에 그 값을 두 번 표시 할 수는 없습니다. 만약 내가 제대로 이해하고

현재 결과

Year CustomerID IndustyID ProductCode Value 
2015 A   Z   I   50 
2015 A   Z   U   NULL 
2015 B   Z   I   40 
2016 A   Z   I   20 
2016 B   Z   U   NULL 

나는 무엇

[의사]

left join (Select *, rank() over (partition by whatMakesItUnique Order by ProductCode) distinction From tableA) a 
    on your conditions + a.distinction = 1 

의 I 다음과 같은 것을 시도,

Year CustomerID IndustyID ProductCode Value 
2015 A   Z   I   50 
2015 A   Z   U   NULL 
2015 B   Z   I   40 
2016 A   Z   I   20 
2016 B   Z   U   30 
+4

길 너무 많은 텍스트, 너무 적은 데이터. 귀하의 데이터에 문제가 있음을 알 수 없으므로 귀하를 도와 드릴 수 없습니다. 질문을 편집하고 문제를 보여주는 샘플 데이터를 포함하십시오. –

+1

원하는 결과를 얻으려면 두보기에서 일부 샘플 데이터를 추가하십시오. 이것은 당신이 언급 한 것 이상을 설명 할 것입니다. –

+0

안녕하세요. 귀하의 설명이 명확하지 않습니다. 입력에 어떤 행이 표시되는지를 기준으로 원하는 결과에 어떤 행이 표시되는지 말하십시오. 필요한 출력 및 원하는 출력이 있으면 실행 가능한 예제 입력, DDL,보기를 제공하십시오. 또한 귀하의 현재 출력. [mcve]에 읽고 읽습니다."내가보기 A에 가입하고 싶다"는 의미는 무엇입니까? B? "나는 단지 한 번 가입하고 싶다"는 의미는 무엇입니까? 그리고 제품을 포함한 칼럼에서 A와 B를 합치는 것은 아닙니다. 당신은 무언가 * 같은 것을 의미합니다 - 그게 무슨 뜻입니까? 당신은 실제로 당신이 의미하거나 명확하게 쓰지 않습니다. – philipxy

답변

1

싶습니다 dea는 하나의 행이있을 때 ProductCode "I"에 대해 whatMakesItUnique에 2 행이 있고이 행에 하나의 행이있을 때 번호 1을 할당하는 것입니다.

"whatMakesItUnique"는 아마 열 Year, CustomerID 너의 경우 IndustyID.

+0

환호성! 이것은 올바른 방향으로 나를 넣어! –

0

나는 당신이 외부 적용으로 원하는 것을 할 수 있다고 생각 :

outer apply 
(select top (1) a.* 
from [raw].[ViewA] a 
where a.year = b.year and a.CustomerID = b.CustomerID and 
     a.IndustryID = b.IndustryID 
order by (case a.ProductCode when 'I' then 1 when 'U' then 2 else 3 end) 
) a 

이 제품 코드에 의해 우선 순위 ViewA에서 하나 개의 행을 반환합니다.