2016-12-02 10 views
1

これらの2つのカウント関数を1つのクエリにするにはどうすればよいですか?SQL:1つのクエリで2つのカウント関数?

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

か、これはすべきMySQLでdecode

+0

ここでは、「SUM」から「COUNT」までの条件付き集計を使用して条件付き集計を使用する方法を示します。 'SUM(a = b THEN 1 ELSE 0 END)' –

+0

カラムの別名は非標準SQLです。どのDBMSを使用していますか?標準のSQLでは、 'count(*)filter(MaritalStatus = 'S'')' –

答えて

0

あなたは、和ケースを使用して試みることができます仕事:

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'); 

( "MaritalStatus = 'X')は、0(偽)または1(真)と評価されるブール値です。 MySQL以外のサーバーでは、キャストが必要な場合があります。

0

:とき

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

を使用することができます:あなたは両方をgroupを使用して持つことができます

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

このような要求の場合、集約関数を使用する必要があります。

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

これも機能し、他のMaritalStatusesまで拡張するのは簡単です。

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

from句とjoin句が同じであるため、where条件を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 
関連する問題