检查SQL中的组内是否存在多个条件

时间:2016-06-02 22:18:30

标签: sql tsql group-by predicate

让我们说下面的表格描述了一对多关系

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'并且同一组中(可能不同的)行中的不同列位于某组数值之间。

3 个答案:

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

UPDATE:

如果您这样尝试,您甚至会看到哪些值存在。如果您只对一个或多个"感兴趣?您可以在返回的字符串中检查逗号:

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