0

我需要帮助来编写一个简单的程序。让我解释一下我想要做什么。

我有 3 张桌子

  1. tJobOffer
  2. t应用
  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] ;

结果是

> 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 和状态候选人的统计数据。我有 2 位 Announce 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
4

3 回答 3

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] ;
于 2013-01-03T09:52:39.377 回答
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

与您需要的类别一样多。

于 2013-01-03T09:56:23.190 回答
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);

请注意选择集中存在的列数

于 2013-01-03T10:06:47.083 回答