문제
누군가 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이고 마찬가지로
제휴하지 않습니다 StackOverflow