让我们说下面的表格描述了一对多关系
col1 | col2
-------------
1 | foo
1 | bar
2 | foo
3 | buzz
我需要按col1
进行分组,我需要一个布尔值来指示是否映射到' foo' 和映射到' bar'
因此,最终的结果集将是
col1 | foobar
-------------
1 | 1
2 | 0
3 | 0
在T-SQL中实现这一目标的最佳方法是什么?
我一直在尝试大致相当于以下查询的东西而没有运气。
SELECT
col1
, (
MAX (
CASE WHEN
COL2 = 'foo'
THEN 1 ELSE 0
END) = 1
AND
MAX (
CASE WHEN
COL2 = 'bar'
THEN 1 ELSE 0
END) = 1
)
FROM
table
GROUP BY
col1
修改
为了澄清,这个表是一个简化。
我正在寻找解决一般问题的解决方案,即具有一个多映射并需要使用布尔值生成新的1-1映射,指示可变数量的谓词是否对于组中的不同元素是真的共同领域。 (按相同元素映射到它们的事实分组)
另外,我应该澄清这些不同的谓词可能是任何东西。
例如,也许我想查看其中一行中是否至少有一列=' foo'并且同一组中(可能不同的)行中的不同列位于某组数值之间。
答案 0 :(得分:0)
这个怎么样?
COUNT(DISTINCT col2)
DECLARE @tbl TABLE(col1 INT,col2 VARCHAR(100));
INSERT INTO @tbl VALUES
(1,'foo')
,(1,'bar')
,(2,'foo')
,(3,'buzz');
SELECT col1
,COUNT(DISTINCT col2)-1
FROM @tbl
GROUP BY col1
如果您这样尝试,您甚至会看到哪些值存在。如果您只对一个或多个"感兴趣?您可以在返回的字符串中检查逗号:
DECLARE @tbl TABLE(col1 INT,col2 VARCHAR(100));
INSERT INTO @tbl VALUES
(1,'foo')
,(1,'bar')
,(2,'foo')
,(3,'buzz');
SELECT outerTbl.col1
,STUFF
(
(
SELECT DISTINCT ', ' + col2
FROM @tbl AS innerTbl
WHERE innerTbl.col1=outerTbl.col1
FOR XML PATH('')
),1,2,''
)
FROM @tbl AS outerTbl
GROUP BY outerTbl.col1
结果如下:
1 bar, foo
2 foo
3 buzz
答案 1 :(得分:0)
这是一个简单的选项
select col1
,MAX(case when col2='foo' then 1 else 0 end)*MAX(case when col2='bar' then 1 else 0 end) foobar
from @tbl
group by col1
答案 2 :(得分:0)
试试这个:
select
col1,
case when foo > 0 and bar > 0 then true else false end foobar
from (
select
col1,
sum(case when col2 = 'foo' then 1 end) foo,
sum(case when col2 = 'bar' then 1 end) bar
from table
group by col1) x