2013-01-03 89 views
0

我需要幫助寫一個簡單的程序。讓我解釋我想要做的事情。是否可以在一個SQL請求中獲得多個COUNT?

我有3個表

  1. tJobOffer
  2. TApplication的
  3. tApplicationStatus

我想創建返回我tJobOffer列表與不同的統計信息的程序這個tJobOffer。 tApplicationStatus鏈接到與tJobOffer鏈接的tApplication。應用程序可以是候選人/接受/ REFUSED/IGNORED/...

我創造了這個查詢:

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] ; 

結果是

> 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 

的結果是正確的。我得到了我的工作狀態候選人的統計數據。我有2名候選人宣佈c和1名候選人宣佈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 

回答

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] ; 
0

是的,它是。一種方法是使用PIVOT功能。另一種方式來做到這一點是使用LEFT OUTER每次需要的項目數,類似的東西時JOIN:

SELECT a.JobID, COUNT(b.JobID), COUNT(c.JobID) 
FROM AllVacancies as a 
LEFT OUTER JOIN 
    (SELECT JobID from AllVacancies WHERE ApplicationStatus = 'CANDIDATE') as b 
ON a.JobID = b.JobID 
LEFT OUTER JOIN 
    (SELECT JobID FROM AllVacancies WHERE ApplicationStatus = 'ACCEPTED') as c 
ON a.JobID = cJobID 

多次,你需要的類別。

0

是的,你可以隨身攜帶儘可能多的次數,只要你想

試試這個

SELECT COUNT(1),COUNT(2) FROM demoTable; 

這會給你沒有行數列1和列中有兩個

通常這將導致相同的計數,除非您有任何列中存在任何空值allowesd並存在。 如果任何列有任何空值,那麼其計數可能會有所不同,所以基本上想法是在主鍵列上應用計數。

Select count(*) from demoTable ; 

此行也導致計數值,但它適用於完整的表,所以在性能上與任何特定列明智的應用數量比較好。

再次對準確度問題,這必須應用於具有主鍵或非空約束的列。

進一步前進,你不需要限制到一個表

SELECT COUNT(1),COUNT(2) FROM (joins or any selection from any no of table); 

只是知道的沒有現有在選擇列設置

相關問題