TSQL:如何编写此查询?

时间:2012-02-23 10:31:03

标签: sql sql-server tsql

我有一个返回结果集的查询,如下所示:

A   |   B
---------------------
1   |   a
2   |   a
1   |   b
1   |   c
3   |   d

A|B在结果中是唯一的(即只会有一个1|a行)

我需要根据这些结果编写两个查询。第一个:

给定A的值(比如1),计算只有一行的B的数量;在1列中使用A

所以在上面的数据集中,id期望返回值 2 ,因为Bbc只有每行一行,其中这些行在1列中有Ad不会被计算在内,因为它与3相对应,并且a不会被返回,因为它还有一行2

希望这是有道理的。

第二个查询与上述相反。

给定A的值(比如说1),计算有2行或更多行的B个数,其中一行有1A列。

因此,在上面的数据中,ID期望返回 1 ,因为Ba是唯一一个有多行的值,其中一行他们在A栏中有一个1

由于

2 个答案:

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