Frage

Kann jemand bitte lassen Sie mich wissen, wie die verschiedenen Segmente der drei Reihen zu erhalten, die auf unterschiedliche Weise sich schneid verwenden SQL? Die drei Reihen in # t2 repräsentieren Sätze A, B, C - Ich bin für AIB, AIC, BIC, AIBIC, A 'B', C‘, etc., (7 mögliche Segmente mit 3 Zeilen, wie in einem Venn-Diagramm) wo ich die Kreuzung.

Ich bin für eine generische Lösung, die n Anzahl der Zeilen in # T2 verarbeiten kann.

-- 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

Der Ausgang Ich suche ist,

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)

Der Ausgang hat 5 Segmente, anstatt die möglichen 7 als zwei davon Null sind.

War es hilfreich?

Lösung

Wenn ich das Problem richtig verstanden habe, ich glaube, Sie müssen auf die Verwendung einer Schleife zurückgreifen kann mit ‚n‘ Anzahl der Zeilen zu bewältigen

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

Andere Tipps

Wie wäre das?

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

Wenn Sie die Tabelle 2 als

popluate können
1, Key1-Value 1
2, Key1-Value 2
4, Key1-Value 3

ebenfalls, wenn Sie mehr Schlüssel1 die dann die Identitätsspalte haben, wie Sie haben, sollten als binärer Baum aufgefüllt werden. so dass die Werte in t2 wären

1 , 1
2 , 2
4 , 3

Dann brauchen Sie einen wählen tun:

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

wird der Ausgang erhalten werden Sie

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

Sie können sehen, dass 1,2,4 A sein wird 'B', ‚C 2 wird A sein | B wird 7 sein A | B | C und ebenfalls

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top