检查 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
假设我有以下描述一对多关系的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