我有一个返回结果集的查询,如下所示:
A | B
---------------------
1 | a
2 | a
1 | b
1 | c
3 | d
A|B
在结果中是唯一的(即只会有一个1|a
行)
我需要根据这些结果编写两个查询。第一个:
给定A
的值(比如1
),计算只有一行的B
的数量;在1
列中使用A
。
所以在上面的数据集中,id期望返回值 2
,因为B
值b
和c
只有每行一行,其中这些行在1
列中有A
。 d
不会被计算在内,因为它与3
相对应,并且a
不会被返回,因为它还有一行2
。
希望这是有道理的。
第二个查询与上述相反。
给定A
的值(比如说1
),计算有2行或更多行的B
个数,其中一行有1
个A
列。
因此,在上面的数据中,ID期望返回 1
,因为B
值a
是唯一一个有多行的值,其中一行他们在A栏中有一个1
。
由于
答案 0 :(得分:6)
使用:
declare @t table(A int, B char(1))
insert @t values
(1, 'a'),
(2, 'a'),
(1, 'b'),
(1, 'c'),
(3, 'd')
declare @x int = 1
select COUNT(*)
from @t t
where t.A = @x
and not exists(select 1 from @t t2 where t2.B = t.B and t2.A <> @x)
select COUNT(*)
from @t t
where t.A = @x
and exists(select 1 from @t t2 where t2.B = t.B and t2.A <> @x)
查询提供了完全想要的结果:
-----------
2
-----------
1
答案 1 :(得分:2)
使用CTE和窗口聚合函数,可以这样做:
WITH
sampledata (A, B) AS (
SELECT 1, 'a' UNION ALL
SELECT 2, 'a' UNION ALL
SELECT 1, 'b' UNION ALL
SELECT 1, 'c' UNION ALL
SELECT 3, 'd'
),
counted AS (
SELECT
A,
B,
COUNT(*) OVER (PARTITION BY B) B_count
FROM sampledata
)
SELECT
COUNT(*)
FROM counted
WHERE A = 1
AND B_count = 1 /* change to "> 1" to get the other result */