1

SQL を使用して異なる方法で交差している 3 つの行の異なるセグメントを取得する方法を教えてください。#t2 の 3 つの行はセット A、B、C を表します - 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)

そのうちの 2 つが NULL であるため、出力には可能な 7 つのセグメントではなく、5 つのセグメントがあります。

4

3 に答える 3

3

問題を正しく理解していれば、「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
于 2008-10-21T08:15:04.390 に答える
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
于 2008-10-20T23:22:02.173 に答える
0

表2に次のように入力できる場合

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

同様に、より多くの key1 がある場合は、ID 列をバイナリ ツリーとして入力する必要があります。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 になり、同様に

于 2008-10-21T06:46:10.123 に答える