Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中拆分行_Sql_Rows_Split - Fatal编程技术网

在SQL中拆分行

在SQL中拆分行,sql,rows,split,Sql,Rows,Split,有人能告诉我如何使用SQL获取以不同方式相交的三行的不同段吗?t2中的三行表示集合A、B、C——我正在寻找A、B、C、A、B、C、A、B、C等7个可能的段,其中有3行,如维恩图中的I为交点 我正在寻找一个通用的解决方案,它可以处理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_

有人能告诉我如何使用SQL获取以不同方式相交的三行的不同段吗?t2中的三行表示集合A、B、C——我正在寻找A、B、C、A、B、C、A、B、C等7个可能的段,其中有3行,如维恩图中的I为交点

我正在寻找一个通用的解决方案,它可以处理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)
输出有5个段,而不是可能的7个段,因为其中两个是空的。

这如何

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

如果你能把表2列为

1, Key1-Value 1
2, Key1-Value 2
4, Key1-Value 3
同样,如果您有更多的key1,那么您的identity列应该作为二叉树填充。 所以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,同样

如果我正确理解了这个问题,我认为您可能必须使用循环来处理“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

您可能需要编辑问题,以删除实际不是代码的部分之前的空格。很难看清你现在的样子。帮我理解你的问题。这些信是从哪里来的?你真的希望结果中有字母吗?如果是,分配它们的规则是什么?另外,我不明白数字12、16和17的输出,为什么在结果中包含A、B和C的交集?如果我可以重新表述你的问题,这是否准确?您需要t1.key2中的每个不同值以及t2中的哪些记录是它们的成员。我要查找的是当a、B和C像维恩图中那样相交时所有可能的不同段。这些段中的一些可能是空的。我实际上不需要结果中的字母。我只是想说明结果来自哪里。12-它是A和C的交点减去三个项目之间的公共交点。尽管我的示例是针对3行的,但我正在寻找一个通用解决方案来解决较大数量的行。谢谢。它适用于3个值。但是,我实际上在寻找一个解决方案,它可以处理n的任何更大的值,比如说,100,1000等等。,。当然,并非所有组合都存在,结果将类似于稀疏矩阵,但查询需要处理组合不为NULL的位置。谢谢。这似乎奏效了。我试图避免循环,我不确定这是可能的。再次感谢。我知道您建议将t2作为插入t2值1、1、2、2、4、3,其中1、2和4是生成的值2^n。但是,我不确定是否有更多的key1,然后是identity列…二叉树。。。1, 1 2, 2 4, 3.. 请举例说明。另外,如果t2有1000行,我们将取大约2^1000行。你有更好的建议吗?谢谢。如果我们有更多的键1,那么t2中的行id将有1、2、4、8、16、32等值。如果我们谈论的是1000行,那么我认为这不是一个可行的选项,因为行id值将变得非常大。您能解释一下10011002等在输出中的重要性和重要性吗?数字1001、1002等没有意义。它们只是从1001开始的标识值。我只是让它们与示例中的键值1、2、3、101、102等区分开来。可以是任何号码。但是,使用2^n无法处理1000行。谢谢。只是想澄清一下,所有A'的标识值1001应该是相同的?