문제

누군가 SQL을 사용하여 다른 방식으로 교차하는 세 행의 다른 세그먼트를 얻는 방법을 알려주시겠습니까? #T2의 3 행은 세트 A, B, C를 나타냅니다. I는 AIB, AIC, BIC, AIBIC, A ', B', C '등을 찾고 있습니다 (벤 다이어그램에서와 같이 3 행을 가진 7 개의 가능한 세그먼트) 내가 교차로 인 곳.

#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 대신 5 개의 세그먼트가 있습니다.

도움이 되었습니까?

해결책

문제를 올바르게 이해 한 경우, '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

다른 팁

이건 어때?

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

표 2를 배출 할 수있는 경우

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

마찬가지로 Key1이 더 많으면 신분 열이 이진 트리로 채워져 있어야합니다. 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이고 마찬가지로

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top