我需要帮助来编写一个简单的程序。让我解释一下我要做的事情。
我有3张桌子
我想创建一个程序,它返回一个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] ;
结果是
> 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
结果是正确的。我得到了我的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
答案 0 :(得分:5)
使用SUM
和CASE
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] ;
答案 1 :(得分: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
与您需要的类别一样多次。
答案 2 :(得分:0)
是的,你可以携带任意数量的计数
试试这个
SELECT COUNT(1),COUNT(2) FROM demoTable;
这将为您提供第1列和第2列中没有行的计数
通常这将导致相同的计数,除非您在任何列中有任何允许且存在的空值。 如果任何列具有任何空值,则其计数可能不同,因此基本上我们的想法是在主键列上应用计数。
Select count(*) from demoTable ;
此行也会产生计数值,但它适用于整个表,因此在任何特定列上应用计数的性能更好。
再次针对准确性问题,这必须应用于具有主键或非空约束的列。
进一步发展,你不需要限制一个表
SELECT COUNT(1),COUNT(2) FROM ( joins or any selection from any no of table);
请注意选择集中存在的列数