检查 SQL 中的一个组内的多个条件是否为真

Checking to see if multiple conditions are true within a group in SQL

假设我有以下描述一对多关系的table

col1  |  col2
------------- 
1     |  foo
1     |  bar
2     |  foo
3     |  buzz

我需要按 col1 分组,我需要一个布尔值来指示是否存在 both 到 'foo' 的映射and 映射到 '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

编辑:

澄清一下,table 是一种简化。

我正在寻找解决具有一对多映射并需要生成新的一对一映射的一般问题的解决方案,该映射具有一个布尔值,指示变量中不同元素的谓词数量是否为真共同域中的组。 (按同一元素映射到它们的事实分组)

此外,我应该澄清一下,这些不同的谓词可以是任何东西。

例如,也许我想查看其中一行中的至少一列 = 'foo' 以及同一组中(可能不同的)行中的不同列是否介于一组特定的数值。

这个呢?

编辑:最好使用 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

更新:

如果你这样尝试,你甚至会看到那里有哪些值。如果您只对 "one or many" 感兴趣,您可以检查返回字符串中的逗号:

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

这是一个简单的选项

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

试试这个:

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