TSQL: как написать этот запрос? - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть запрос, который возвращает набор результатов, который выглядит следующим образом:

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

A|B уникален в результатах (то есть когда-либо будет только одна 1|a строка)

Мне нужно написать два запроса на основе этих результатов.Первое:

, учитывая значение для A (скажем, 1), подсчитывать количество B s, которые имеют только одну строку;с 1 в столбце A.

, поэтому в указанном выше наборе данных id ожидает, что будет возвращено значение 2, поскольку B значения bи c имеет только одну строку, где эти строки имеют 1 в столбце A.d не будет засчитано, поскольку оно соответствует 3, а a не будет возвращено, поскольку в нем есть дополнительная строка с 2.

Надеюсь, что имеет смысл.

Второй запрос противоположен приведенному выше.

Учитывая значение для A (скажем, 1), подсчитайте количество B с двумя или более строками, где одна изСтроки имеют 1 в столбце A.

Таким образом, в приведенных выше данных идентификатор ожидает возврата 1, поскольку значение B a являетсятолько тот, который имеет несколько строк, одна из которых имеет 1 в столбце А.

Спасибо

Ответы [ 2 ]

6 голосов
/ 23 февраля 2012

Использование:

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
2 голосов
/ 23 февраля 2012

С 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 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...