2016-12-17 1 views
-2

그룹 내의 모든 레코드 조합을 찾을 수있는 T-SQL 루틴 (SQL Server 2014)을 개발하려고합니다.TSQL : 크로스 조인없이 그룹 내의 행 조합 찾기

주어진 다음의 데이터 :

ID_COMBINATION | ID_POSITION | MULTIPLY_FACTOR 
-----------------------------------------------  
     1  |  1 |  1 
     1  |  1 |  2 
     1  |  1 |  3 
     1  |  2 |  1 
     1  |  2 |  2 
     1  |  2 |  3 

내가해야 주어진 ID_COMBINATION

결과에 대한 ID_POSITIONS의 전체 집합에 대한 MULTIPLY_FACTOR의 조합을 계산하고 싶습니다 :

1 | 1 | 1 
1 | 2 | 1 
1 | 1 | 1 
1 | 2 | 2 
1 | 1 | 1 
1 | 2 | 3 
... 
1 | 1 | 3 
1 | 2 | 3 

을 잠시 닫힌 루틴 정의를 선호하는 순간 (uniq의 수에 따라 런타임에 다중 교차 조인 코드를 생성하기 위해 동적 SQL을 사용하는 것보다 그룹 내 ID_POSITIONS)

도움 주셔서 감사합니다.

편집 : 나는 각각의 MULTPLY_FACTOR 값을 갖는 새 ID_POSITION 키를 추가하면 내가 가진 것,

declare @Samples as Table (Id_Combination Int, Id_Position Int, Multiply_Factor Int); 
INSERT INTO @Samples (Id_Combination, Id_Position, Multiply_Factor) 
    VALUES (1, 1, 1), (1, 1, 2), (1, 1, 3) 
    , (1, 2, 1), (1, 2, 2), (1, 2, 3) 

SELECT 
    S1.Id_Combination 
    ,S1.Id_Position AS s1_idpos 
    ,S1.Multiply_Factor AS s1_mufac 
    ,S2.Id_Position AS s2_idpos 
    ,S2.Multiply_Factor AS s2_mufac 
FROM @Samples AS S1 
INNER JOIN @Samples AS S2 
    ON s1.Id_Combination = s2.Id_Combination 
    AND s1.Id_Position < s2.Id_Position 

그러나 :

다음 TSQL 코드가 주어진 ID_COMBINATION 한 고유 ID_POSITION의 조합을 계산 조인 조건을 수정하고 다음과 같이 새로운 시나리오를 처리하는 명령문을 선택하십시오.

declare @Samples as Table (Id_Combination Int, Id_Position Int, Multiply_Factor Int); 
INSERT INTO @Samples (Id_Combination, Id_Position, Multiply_Factor) 
    VALUES (1, 1, 1), (1, 1, 2), (1, 1, 3) 
    ,(1, 2, 1), (1, 2, 2), (1, 2, 3), 
    ,(1, 3, 1), (1, 3, 2), (1, 3, 3); 

    SELECT 
     S1.Id_Combination 
     ,S1.Id_Position AS s1_idpos 
     ,S1.Multiply_Factor AS s1_mufac 
     ,S2.Id_Position AS s2_idpos 
     ,S2.Multiply_Factor AS s2_mufac 
     ,S3.Id_Position AS s3_idpos 
     ,S3.Multiply_Factor AS s3_mufac 
    FROM @Samples AS S1 
    INNER JOIN @Samples AS S2 
     ON s1.Id_Combination = s2.Id_Combination 
     AND s1.Id_Position < s2.Id_Position 
    INNER JOIN @Samples AS S3 
     ON s2.Id_Combination = s3.Id_Combination 
     AND s2.Id_Position < s3.Id_Position 

내 질문 일반 아이디어로 돌아가서 : 여기에 "가능한", ID_POSITION 도메인에서 모든 가능한 미래의 가치를 커버하고 SELECT 절에 새로운 필드를 추가하는 대신 수직으로 가치를 제시하는 "일반"TSQL 코드를 작성하는 방법. 부모의 ID_COMBINATION 안에서 서로 다른 조합을 구별하기 위해 일부 SUB_COMBINATION 키가 추가되어야합니다. ...

+0

왜 크로스 조인을 사용 하시겠습니까? –

+0

@TimBiegeleisen 디자인 타임에 설정된 ID_POSITION의 크기를 추정 할 수 없기 때문에. 그렇다면 동적 SQL을 사용하지 않고도이 솔루션을 코딩 할 수 없습니다. CROSS JOIN을 사용하기보다는 동적 SQL에 대한 대안을 찾고자합니다. –

+0

새 샘플 코드를 수정하고 실행하면 제공 한 샘플 결과 (예 : 3 개 대신 7 개의 열)와는 다른 결과가 나타납니다. 나는 혼란스러워. – HABO

답변

0

"내 ID_POSITION의 크기"를 다시 알 수 없으므로 그것은이 쉽지 않은 이유는 물어 볼게요 : 당신이 여분의 샘플 데이터 행의 주석을 경우 더 결과 행을 얻을 것이다

-- Sample data. 
declare @Samples as Table (Id_Combination Int, Id_Position Int, Multiply_Factor Int); 
insert into @Samples (Id_Combination, Id_Position, Multiply_Factor) values 
    (1, 1, 1), (1, 1, 2), (1, 1, 3), -- (1, 1, 4), -- Try me. 
    (1, 2, 1), (1, 2, 2), (1, 2, 3); 
select * from @Samples; 

-- Generate all possible combinations of all values. 
select distinct S1.Id_Combination, S2.Id_Position, S3.Multiply_Factor 
    from @Samples as S1 cross join @Samples as S2 cross join @Samples as S3 
    order by Id_Combination, Id_Position, Multiply_Factor; 

참고.

+0

"ID_POSITION의 크기"라고 말하면 고유 ID_POSITION 값의 각 ID_COMBINATION 수가 달라진다는 뜻입니다. –