Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stored procedure containing inner join with count not working

Let's say i've got a databasetable looking a bit like this, containing information about some assignments.

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

I want to generate an overview foreach profession (assignments belong to a certain profession) and count the number of assignment in each profession. The overview coming from the database should look like this;

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

I've currently got a stored procedure returning the overview above, except that the amount of assignments isn't correct. Assignments with a closingdate in the past (we then assume the assignment is closed) shouldn't be taken into the the total number of assignment.

The current stored procedure is like this:

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

I've already came up with and modified procedure like the one below, but it doesn't work. It feels like i'm either thinking too difficult or missing something obvious. What could go wrong?

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

UPDATE 1: Added where condition for date

like image 637
Rob Avatar asked Dec 21 '25 16:12

Rob


1 Answers

I don't think that you need to join against the table ME_profession again, try this:

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
like image 156
Lamak Avatar answered Dec 23 '25 07:12

Lamak