2016-12-02 6 views
1

Как получить эти две функции подсчета в один запрос?SQL: две функции подсчета в одном запросе?

SELECT 
    COUNT(MaritalStatus) as 'Married' 
FROM 
    Person.Person PP 
INNER JOIN 
    HumanResources.Employee HRE ON PP.BusinessEntityID = HRE.BusinessEntityID 
WHERE 
    MaritalStatus = 'M'; 

SELECT 
    COUNT(MaritalStatus) as 'Single' 
FROM 
    Person.Person PP 
INNER JOIN 
    HumanResources.Employee HRE ON PP.BusinessEntityID = HRE.BusinessEntityID 
WHERE 
    MaritalStatus = 'S'; 
+0

Трюки здесь предназначены для использования условной агрегации путем внедрения 'COUNT' через' SUM'. 'SUM (CASE WHEN a = b THEN 1 ELSE 0 END)' –

+0

Ваши псевдонимы столбцов являются нестандартными SQL. Какие СУБД вы используете? В стандартном SQL вы можете использовать фильтр count (*) (где MatStatus = 'S'') ' –

ответ

0

Вы можете попробовать использовать случай сумму, когда:

SELECT SUM(CASE WHEN MaritalStatus = 'M' THEN 1 ELSE 0 END), 
SUM(CASE WHEN MaritalStatus = 'S' THEN 1 ELSE 0 END) 
FROM Person.Person PP INNER JOIN HumanResources.Employee HRE 
ON PP.BusinessEntityID = HRE.BusinessEntityID 
0

Вы можете использовать group и иметь как:

SELECT COUNT(MaritalStatus) as 'Status' 
    FROM Person.Person PP INNER JOIN HumanResources.Employee HRE 
    ON PP.BusinessEntityID = HRE.BusinessEntityID 
    group by MaritalStatus; 

или вы можете использовать decode

0

С MySQL это должно работы:

SELECT SUM(MaritalStatus = 'M') as 'Married', 
     SUM(MaritalStatus = 'S') as 'Single' 
FROM Person.Person PP INNER JOIN HumanResources.Employee HRE 
ON PP.BusinessEntityID = HRE.BusinessEntityID 
WHERE MaritalStatus IN ('M', 'S'); 

("MatStatus = 'X') является логическим значением, которое вычисляется как 0 (false) или 1 (true). На других серверах, кроме MySQL, может потребоваться бросок.

0

Для этого запроса вам необходимо использовать функции агрегации.

SELECT MaritalStatus, COUNT(MaritalStatus) 
FROM Person.Person PP 
    INNER JOIN HumanResources.Employee HRE 
     ON PP.BusinessEntityID = HRE.BusinessEntityID 
GROUP BY MaritalStatus; 

Этот выход будет что-то вроде этого:

MaritalStatus | COUNT(MaritalStatus) 
       | 
M    | 50 
S    | 20 

Как две строки. Вы можете добавить ORDER BY MaritalStatus, чтобы гарантировать, что вы получите данные в правильном порядке, потому что порядок, по которому вы получаете данные, не является детерминированным.

Преимущество использования этого над SUM() заключается в том, что если вы когда-либо добавляете еще одно семейное положение, ваш запрос не изменится.

0

Это также работает и достаточно легко распространяться на другие Семейные штаты.

SELECT married.*, single.* from 
( SELECT COUNT(MaritalStatus) as 'Married' 
    FROM Person.Person PP INNER JOIN HumanResources.Employee HRE 
    ON PP.BusinessEntityID = HRE.BusinessEntityID 
    WHERE MaritalStatus = 'M' 
    ) married 
, (
    SELECT COUNT(MaritalStatus) as 'Single' 
    FROM Person.Person PP INNER JOIN HumanResources.Employee HRE 
    ON PP.BusinessEntityID = HRE.BusinessEntityID 
    WHERE MaritalStatus = 'S' 
    ) single 
1

Поскольку ваши предложения и соединения идентичны, просто переместите условия, в которых содержатся условия, в оператор case.

SELECT COUNT(case when MaritalStatus = 'M' then 1 end) as 'Married', 
     COUNT(case when MaritalStatus = 'S' then 1 end) as 'Single' 
FROM Person.Person PP 
JOIN HumanResources.Employee HRE 
    ON PP.BusinessEntityID = HRE.BusinessEntityID