2008-10-20 6 views
1

SQL을 사용하여 서로 다른 방식으로 교차하는 세 행의 다른 세그먼트를 가져 오는 방법을 알려주십시오. # t2의 세 줄은 AIB, AIC, BIC, AIBIC, A ', B', C '등 (벤 다이어그램에서와 같이 3 개의 행으로 구성된 7 개의 가능한 세그먼트)을 찾고 있습니다. 나는 어디에서 교차점인가.SQL에서 행 나누기

# t2에서 n 개의 행을 처리 할 수있는 일반적인 솔루션을 찾고 있습니다.

-- SQL Code Begin 
create table #t1 (key1 int, key2 int) -- for each Key1 there can be 1 or more Key2 
go 
create table #t2 (row_id int identity(101, 1), key1 int) --row_id is the primary key 
go 

insert into #t1 
select 1, 11 union select 1, 12 union select 1, 13 union select 1, 14 union 
select 2, 13 union select 2, 15 union select 2, 16 union select 2, 17 union 
select 3, 13 union select 3, 12 union select 3, 16 union select 3, 17 

-- 1 --> 11, 12, 13, 14 
-- 2 --> 13, 15, 16, 17 
-- 3 --> 13, 12, 16, 17 

insert into #t2 (key1) 
select 1 union select 2 union select 3 

-- SQL Code End 

내가 찾고 있어요 출력은,

1001 11 (A') 
1001 14 (A') 
1002 12 (A I C - A I B I C) 
1003 13 (A I B I C) 
1004 15 (B') 
1005 16 (B I C - A I B I C) 
1005 17 (B I C - A I B I C) 

출력은 5 개 세그먼트를 가지고, 대신 그들의 2로 가능한 7 NULL입니다.

+0

실제로 편집하지 않은 섹션 앞의 공백을 제거하기 위해 질문을 편집 할 수 있습니다. 당신이 여기있는 그대로 읽는 것은 정말로 어렵습니다. – Randy

+0

질문에 대한 이해를 도울 수 있습니다. 편지는 어디에서 왔습니까? 결과에 정말로 편지를 원하십니까? 그렇다면 할당하는 규칙은 무엇입니까? 또한 숫자 12, 16 및 17의 결과를 이해할 수 없습니다. 결과에 A, B 및 C의 교차 부분을 포함시키는 이유는 무엇입니까? –

+0

질문을 수정하면 정확할까요? # t1.key2의 고유 값과 # t2의 어떤 레코드가 구성원인지를 원하게됩니다. –

답변

3

문제가 올바르게, 나는 당신이 행을 'n'에 대처하기 위해 루프를 사용하는 데 의존해야 할 것 같아요

DECLARE @Key2 INT 
DECLARE @Subset VARCHAR(1000) 
DECLARE @tblResults TABLE 
(
    Key2 INT, 
    Subset VARCHAR(1000) 
) 

SET @Subset = '' 
SELECT @Key2 = MIN(Key2) FROM #t1 

WHILE @Key2 IS NOT NULL 
BEGIN 
    SELECT @Subset = @Subset + CAST(Key1 AS VARCHAR(10)) 
    FROM #t1 
    WHERE Key2 = @Key2 

    INSERT INTO @tblResults (Key2, Subset) 
    VALUES (@Key2, @Subset) 

    SET @Subset = '' 
    SELECT @Key2 = MIN(Key2) FROM #t1 WHERE Key2 > @Key2 
END 

SELECT * FROM @tblResults 
+0

감사합니다. 트릭을하는 것처럼 보입니다. 나는 확실하지 않은 루프를 피하려고 노력했다. 다시 한번 감사드립니다. – user26309

0

어때? 당신은 당신이 다음 ID 열을 더 키 1의이 경우도 마찬가지로

1, Key1-Value 1 
2, Key1-Value 2 
4, Key1-Value 3 

으로 테이블 2 popluate 경우

SELECT key2, 
    CASE 
    WHEN InA = 1 and InB = 1 and InC = 1 THEN 'ABC' 
    WHEN InA = 0 and InB = 1 and InC = 1 THEN 'BC' 
    WHEN InA = 1 and InB = 0 and InC = 1 THEN 'AC' 
    WHEN InA = 1 and InB = 1 and InC = 0 THEN 'AB' 
    WHEN InA = 1 and InB = 0 and InC = 0 THEN 'A' 
    WHEN InA = 0 and InB = 1 and InC = 0 THEN 'B' 
    WHEN InA = 0 and InB = 0 and InC = 1 THEN 'C' 
    ELSE 'I''m broke' 
    END as [SubSet] 
FROM 

(
SELECT key2, 
    MAX(CASE WHEN key1 = 1 THEN 1 ELSE 0 END) as InA, 
    MAX(CASE WHEN key1 = 2 THEN 1 ELSE 0 END) as InB, 
    MAX(CASE WHEN key1 = 3 THEN 1 ELSE 0 END) as InC 
FROM #t1 
WHERE key1 in (1, 2, 3) 
GROUP BY key2 
) sub 

ORDER BY key2 
+0

고마워요. 3 가지 값에 대해 작동합니다.그러나 실제로 n에 대한 더 큰 값 (예 : 100, 1000 등)을 처리 할 수있는 솔루션을 찾고 있습니다. 물론 모든 조합은 존재하지 않을 것이고 결과는 희소 매트릭스와 같을 것입니다. 그러나 조합은 NULL이 아닌 조합을 처리해야합니다. – user26309

0

, 이진 트리로 채워 져야합니다. 그래서 T2의 값은 다음 당신이 선택해야 할

1 , 1 
2 , 2 
4 , 3 

될 것이라고 :

select sum(identity), key2 
from t1, t2 
where t1.key1 = t2.key1 
groupby key2 

당신이 얻을 것이다 출력이는 것을 볼 수 있습니다

1 11 
5 12 
7 13 
1 14 
2 15 
6 16 
6 17 

될 것입니다 (1) , 2,4 '는 A', B ', C'2는 A | B, 7은 A | B | C가되며 마찬가지로 마찬가지로

+0

# t2를 으로 # t2 값 (1, 1), (2, 2), (4,3)에 삽입하는 것이 좋습니다. 1,2 및 4는 생성 된 값 (2^n)입니다. 그러나, 나는 "당신이 더 많은 key1을 가지고 있다면 identity 컬럼 ... 2 진 트리 ... 1, 1 2, 2 4, 3"부분에 대해 확신하지 못합니다. " 예를 들어 설명해주십시오. – user26309

+0

또한 # t2에 1000 개의 행이있는 경우 약 2^1000을 사용합니다. 더 좋은 제안이 있습니까? 감사. – user26309

+0

우리가 Key1의 값이 더 있다면 t2의 row_id는 1,2,4,8,16,32 등과 같은 값을 가질 것입니다. 만약 우리가 1000 행에 대해서 이야기하고 있다면, 이것이 행의 ID 값으로서 실현 가능한 옵션이라고 생각하지 않습니다. 매우 커질 것이다. 출력에서 ​​1001,1002 등의 중요도 및 중요도를 설명 할 수 있습니까? – Dheer