是否可以在一个SQL请求中获得多个COUNT?

Bas*_*mme 0 sql t-sql join sql-server-2008

我需要帮助来编写一个简单的程序.让我解释一下我要做的事情.

我有3张桌子

  1. tJobOffer
  2. TApplication的
  3. tApplicationStatus

我想创建一个程序,它返回一个tJobOffer列表,其中包含此tJobOffer的不同状态统计信息.tApplicationStatus链接到链接到tJobOffer的tApplication.申请可以是候选/接受/拒绝/忽略/ ......

我创建了这个查询:

    SELECT 
        [T].[JobOfferId],
        [T].[JobOfferTitle],
        COUNT([A].[ApplicationId]) AS [CandidateCount]

    FROM        [tJobOffer] AS [T]
    LEFT JOIN   [tApplication] AS [A]
        INNER JOIN   [tApplicationStatus] AS [S]
            ON      [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
            AND     [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
        ON      [A].[JobOfferId] = [T].[JobOfferId]

    GROUP BY
            [T].[JobOfferId],
            [T].[JobOfferTitle]

    ORDER BY [T].[JobOfferTitle] ;
Run Code Online (Sandbox Code Playgroud)

结果是

> 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA  Announce a  0
> F26B228D-0C81-4DA8-A287-F8F997CC1F9C  Announce b  0
> 9DA60B23-F113-4C7F-9707-2B90C1556D5D  Announce c  2
> 258E11A7-79C1-47B6-8C61-413AA54E2360  Announce d  0
> DA582383-5DF4-4E1D-837C-382371BDEF57  Announce e  1
Run Code Online (Sandbox Code Playgroud)

结果是正确的.我得到了我的tJoboffers与候选人的统计数据.我有两个候选人宣布c和一个候选人宣布e.如果我将字符串'CANDIDATE'更改为'ACCEPTED'或'REFUSED',我可以获得有关这些状态的统计信息.是否可以在一个请求中获取所有内容?

就像是

> 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA  Announce a  0   0   2
> F26B228D-0C81-4DA8-A287-F8F997CC1F9C  Announce b  0   0   1
> 9DA60B23-F113-4C7F-9707-2B90C1556D5D  Announce c  2   0   0
> 258E11A7-79C1-47B6-8C61-413AA54E2360  Announce d  0   0   0
> DA582383-5DF4-4E1D-837C-382371BDEF57  Announce e  1   1   0
Run Code Online (Sandbox Code Playgroud)

Joh*_*Woo 5

使用SUMCASE

SELECT 
    [T].[JobOfferId],
    [T].[JobOfferTitle],
    SUM(CASE WHEN [S].[ApplicationStatusTechnicalName] = 'CANDIDATE' THEN 1 ELSE 0 END) AS [CandidateCount],
    SUM(CASE WHEN [S].[ApplicationStatusTechnicalName] = 'ACCEPTED' THEN 1 ELSE 0 END) AS [ACCEPTEDCount],
    SUM(CASE WHEN [S].[ApplicationStatusTechnicalName] = 'REFUSED' THEN 1 ELSE 0 END) AS [REFUSEDCount]
FROM    [tJobOffer] AS [T]
        LEFT JOIN   [tApplication] AS [A]
            ON      [A].[JobOfferId] = [T].[JobOfferId]
        LEFT JOIN   [tApplicationStatus] AS [S]
            ON      [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
GROUP BY
        [T].[JobOfferId],
        [T].[JobOfferTitle]
ORDER BY [T].[JobOfferTitle] ;
Run Code Online (Sandbox Code Playgroud)