2008-10-20 3 views
1

Может кто-нибудь, пожалуйста, дайте мне знать, как получить различные сегменты трех строк, которые пересекаются по-разному с помощью SQL? Три строки в # t2 представляют множества A, B, C - Я ищу AIB, AIC, BIC, AIBIC, A ', B', C 'и т. Д. (7 возможных сегментов с 3 строками, как на диаграмме Венна) где I - пересечение.Разбиение строк в SQL

Я ищу универсальное решение, которое может обрабатывать n количество строк в # t2.

-- 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 сегментов, а возможный 7 как два из них являются NULL.

+0

Вы можете изменить свой вопрос, чтобы удалить пробел перед разделами, которые на самом деле не код. Трудно прочитать, что у вас здесь есть. – Randy 2008-10-20 22:25:38

+0

Помогите мне понять ваш вопрос. Откуда берутся письма? Вы действительно хотите получать письма в результатах? Если да, то каково правило для их назначения? Кроме того, я не понимаю вывод для чисел 12, 16 и 17, почему вы включаете пересечение A, B & C в результатах? – 2008-10-20 23:41:48

+0

Если бы я мог перефразировать ваш вопрос, это было бы точно? Вы хотите, чтобы каждый из различных значений из # t1.key2 и какие записи в # t2 они являются членами. – 2008-10-20 23:46:02

ответ

3

Если я понял, проблема правильно, я думаю, что вы, возможно, придется прибегнуть к помощи петли, чтобы справиться с «п» число строк

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

Как насчет этого?

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

Если вы можете popluate таблицу 2 как

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

Точно так же, если у вас есть больше ключом1-х, то столбец идентификаторов, как вы есть, должны быть заполнены в виде двоичного дерева. так, что значения в 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, а также

Смежные вопросы