Подсчет двух типов значений в одном поле в MS-Access - PullRequest
3 голосов
/ 24 апреля 2011

У меня есть таблица customerDetail, в которой есть поле c_type, в котором «a» представляет «активный», а «d» представляет «неактивный». Теперь я должен найти количество их обоих в одном запросе.
Я использовал это, но без результата.

SELECT Count(c_type) AS Active, Count(c_type) AS Not_Active  
FROM customerDetail  
WHERE c_type="a" OR c_type="d"

конечно, я знаю, что это выглядит грязно, но я тоже пробовал это, но это тоже не сработало -

SELECT
    Count(customerDetail.c_type) AS Active,
    Count(customerDetail_1.c_type) AS Not_Active  
FROM customerDetail INNER JOIN customerDetail AS customerDetail_1  
ON customerDetail.Id=customerDetail_1.Id  
WHERE (customerDetail.c_type="a") AND (customerDetail_1.c_type="d")

Но, опять же, это тоже не помогло, так что, может, кто-нибудь подскажет, как мне узнать количество активных и неактивных в одном запросе?

Ответы [ 3 ]

5 голосов
/ 24 апреля 2011
select c_type, count(*)
from customer_detail
group by c_type
4 голосов
/ 24 апреля 2011
SELECT
  SUM(IIF(c_type = "a", 1, 0)) AS Active,
  SUM(IIF(c_type = "d", 1, 0)) AS Not_Active,
FROM customerDetail
WHERE c_type IN ("a", "d")

Это было для MS Access.

Каким-то образом я пропустил тег tsql, когда впервые увидел этот вопрос. В Transact-SQL вы можете использовать конструкцию CASE, которую можно назвать более мощным эквивалентом IIF в Access:

SELECT
  SUM(CASE c_type WHEN 'a' THEN 1 ELSE 0 END) AS Active,
  SUM(CASE c_type WHEN 'd' THEN 1 ELSE 0 END) AS Not_Active,
FROM customerDetail
WHERE c_type IN ('a', 'd')

На самом деле, в T-SQL я бы использовал COUNT вместо SUM, например:

SELECT
  COUNT(CASE c_type WHEN 'a' THEN 1 END) AS Active,
  COUNT(CASE c_type WHEN 'd' THEN 1 END) AS Not_Active,
FROM customerDetail
WHERE c_type IN ('a', 'd')

Здесь 1 в каждом выражении CASE может быть заменено на что угодно, если только оно не равно NULL (значения NULL не учитываются). Если часть ELSE опущена, как в запросе выше, подразумевается ELSE NULL.

1 голос
/ 24 апреля 2011

Задачей здесь является ваше требование: " в том же запросе ".

Было бы легко создать отдельные запросы.

qryActive:

SELECT Count(*) AS Active
FROM customerDetail
WHERE c_type="a"

qryInactive:

SELECT Count(*) AS Not_Active
FROM customerDetail
WHERE c_type="d"

Если вам нужно все это в одном, вы можете включить их в качестве подзапросов.

SELECT a.Active, i.Not_Active
FROM
    (SELECT Count(*) AS Active
    FROM customerDetail
    WHERE c_type="a") AS a,
    (SELECT Count(*) AS Not_Active
    FROM customerDetail
    WHERE c_type="d") AS i

Без условия JOIN или WHERE вы получите«перекрестное соединение» (декартово произведение) двух подзапросов.Но поскольку каждый подзапрос создает только одну строку, составной будет состоять только из одной строки.

...