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 に答える