3

假设我有一个看起来有点像这样的数据库表,其中包含有关一些作业的信息。

Id   | ProfessionId      | Title       | Deadline     | DateCreated | ClosingDate
1    |  5                | Something   | 01-12-2012   | 05-11-2012  | 12-11-2012
2    |  6                | Something   | 01-12-2012   | 05-11-2012  | 12-11-2012
3    |  7                | Something   | 01-12-2012   | 05-11-2012  | 12-11-2012
4    |  7                | Something   | 01-12-2012   | 05-11-2012  | 12-11-2012

我想为每个专业生成一个概览(作业属于某个专业)并计算每个专业的作业数量。来自数据库的概览应如下所示;

Id | Name           | FriendlyUrl     | Ordinal   | NumberOfAssignments
5  | Profession 1   | profession-1    | 1         | 1
6  | Profession 2   | profession-2    | 1         | 1
7  | Profession 3   | profession-3    | 1         | 2
8  | Profession 4   | profession-4    | 1         | 0

我目前有一个存储过程返回上面的概述,除了分配的数量不正确。过去截止日期的作业(我们假设作业已结束)不应计入作业总数。

当前的存储过程是这样的:

BEGIN
    SELECT  p.Id, 
            p.Naam, 
            p.FriendlyUrl, 
            p.Ordinal, 
            COUNT(a.ProfessionId) AS NumberOfAssignments
    FROM ME_Profession AS p 
    LEFT OUTER JOIN ME_Assignment AS a ON a.ProfessionId = p.Id
    INNER JOIN ME_Client AS c ON a.ClientId = c.Id
    INNER JOIN aspnet_Membership AS m ON m.UserId = c.UserId
    WHERE m.IsApproved = 1 
    GROUP BY p.Id, p.Naam, p.FriendlyUrl, p.Ordinal
END

我已经想出并修改了如下程序,但它不起作用。感觉好像我要么想得太难,要么错过了一些明显的东西。会出什么问题?

SELECT        p.Id, p.Naam, p.FriendlyUrl, p.Ordinal, pc.NumberOfAssignments
FROM            ME_Profession AS p 
INNER JOIN ME_Assignment AS a ON a.ProfessionId = p.Id 
INNER JOIN ME_Client AS c ON a.ClientId = c.Id
INNER JOIN aspnet_Membership AS m ON m.UserId = c.UserId
INNER JOIN (SELECT a2.ProfessionId, COUNT(*) AS NumberOfAssignments FROM ME_Assignment AS a2 GROUP BY a2.ProfessionId WHERE a2.Closingdate > GETDATE()) pc ON p.ProfessionId = pc.ProfessionId
WHERE        m.IsApproved = 1 AND a.Closingdate > GETDATE()
GROUP BY p.Id, p.Naam, p.FriendlyUrl, p.Ordinal

更新 1:添加了日期的 where 条件

4

3 回答 3

2

我认为您不需要ME_profession再次加入对表,试试这个:

SELECT  p.Id, p.Naam, p.FriendlyUrl, p.Ordinal, pc.NumberOfAssignments,
        COUNT(CASE WHEN ClosingDate > GETDATE() OR ClosingDate IS NULL THEN 1 END) AS NumberOfAssignments 
FROM  ME_Profession AS p 
INNER JOIN ME_Assignment AS a 
    ON a.ProfessionId = p.Id 
INNER JOIN ME_Client AS c 
    ON a.ClientId = c.Id
INNER JOIN aspnet_Membership AS m 
    ON m.UserId = c.UserId
WHERE (m.IsApproved = 1)
GROUP BY p.Id, p.Naam, p.FriendlyUrl, p.Ordinal
于 2012-11-05T19:30:59.400 回答
1

怎么样... LEFT OUTER JOIN (SELECT * FROM ME_Assignment WHERE ClosingDate > GETDATE()) 作为...

于 2012-11-05T19:37:26.463 回答
0

我在当前存储过程中看不到满足此语句的条件:

过去截止日期的作业(我们假设作业已结束)不应计入作业总数。

您可能只需将正在进行的工作中的标准添加到现有的过程中:

WHERE ClosingDate > GETDATE()
于 2012-11-05T19:31:25.247 回答