Pergunta

Alguém pode me informar como obter os diferentes segmentos das três linhas que estão se cruzando de maneiras diferentes usando o SQL? As três linhas em #T2 representam os conjuntos A, B, C - Estou procurando AIB, AIC, BIC, AIBIC, A ', B', C 'etc. (7 segmentos possíveis com 3 linhas como em um diagrama de Venn) onde eu é a interseção.

Estou procurando uma solução genérica que possa lidar com N número de linhas em #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

A saída que estou procurando é,

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)

A saída possui 5 segmentos, em vez dos 7 possíveis, como dois deles são nulos.

Foi útil?

Solução

Se eu entendi o problema corretamente, acho que você pode ter que recorrer ao uso de um loop para lidar com o número de linhas '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

Outras dicas

Que tal agora?

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

Se você pode pobrar a Tabela 2 como

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

Da mesma forma, se você tiver mais Key1's, a coluna de identidade que você tem, deve ser preenchida como uma árvore binária. para que os valores em T2 sejam

1 , 1
2 , 2
4 , 3

Então você precisa fazer uma seleção:

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

a saída que você obterá será

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

Você pode ver que 1,2,4 será A ', B', C '2 será A | B, 7 será A | B | C e da mesma forma

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top