Pregunta

¿Alguien puede, por favor, hacerme saber cómo obtener los diferentes segmentos de las tres filas que se intersecan de diferentes maneras usando SQL? Las tres filas en # t2 representan los conjuntos A, B, C - Estoy buscando AIB, AIC, BIC, AIBIC, A ', B', C 'etc., (7 segmentos posibles con 3 filas como en un diagrama de Venn) donde estoy la intersección.

Estoy buscando una solución genérica que pueda manejar n número de filas en # 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

La salida que estoy buscando es,

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)

La salida tiene 5 segmentos, en lugar de los 7 posibles ya que dos de ellos son NULL.

¿Fue útil?

Solución

Si he entendido el problema correctamente, creo que deberías recurrir al uso de un bucle para hacer frente al 'n' número de filas

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

Otros consejos

¿Qué tal esto?

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

Si puede rellenar la tabla 2 como

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

del mismo modo, si tiene más key1, entonces la columna de identidad que tiene, debe rellenarse como un árbol binario. para que los valores en t2 sean

1 , 1
2 , 2
4 , 3

Entonces necesitas hacer una selección:

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

la salida que obtendrás será

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

puedes ver que 1,2,4 será A ', B', C '2 será A | B, 7 será A | B | C y lo mismo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top