neojakey
neojakey

Reputation: 1663

SQL Statement Output in incorrect Order, not sure why?

For some reason the code below is returning the results, put not in the correct order.

Anyone have any ideas why as I have been looking at it for a couple of hours and have yet to spot the problem:

USE [storeboard]
GO
/****** Object:  StoredProcedure [sbuser].[sp_MemberMailList ]    Script Date: 11/25/2011 12:04:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [sbuser].[sp_MemberMailList ]
    @MemberMailID bigint = null,
    @FromMemberID bigint = null,
    @ToMemberID bigint = null,
    @Subject varchar(150) = null,
    @Message varchar(8000) = null,
    @FromDeletedFlag bit = null,
    @ToDeletedFlag bit = null,
    @FromArchivedFlag bit = null,
    @ToArchivedFlag bit = null,
    @ReadFlag bit = null,
    @SQL nvarchar(4000) = null,
    @SortField varchar(100) = null,
    @SortOrder varchar(25) = null,
    @NotificationSent bit = null,
    @MemberID bigint = null,
    @OnHold bit = 0,
    @SpecialMail varchar(1) = 'N',
    @PageSize float = null,
    @PageNum int = 1,
    @TotalPages float = null,
    @StartDate datetime = null,
    @EndDate datetime = null,
    @MODE varchar(50)

AS

IF @MODE = 'INBOX-MAIL-NOSORT'
    BEGIN
        SELECT @TotalPages = CEILING(COUNT(*)/@PageSize)
        FROM MemberMail
        WHERE ToMemberID = @ToMemberID
        AND ToDeletedFlag = 0
        AND OnHold = 0
        AND ToArchivedFlag = 0
        AND FromDeletedFlag = 0;

        WITH InMailsCDDESC AS
        (

            SELECT ROW_NUMBER() OVER(ORDER BY a.CreateDate DESC) AS RowNum,
            a.MemberMailID,     -- 1
            a.FromMemberID,     -- 2
            a.Subject,          -- 3
            a.CreateDate,       -- 4
            b.UserName,         -- 5
            a.ToReadFlag,       -- 6
            b.Firstname,        -- 7
            b.Lastname,         -- 8
            b.MemberDisplayName AS DisplayName, -- 9
            @TotalPages AS TotalPages -- 10
            FROM MemberMail a
            INNER JOIN Member b ON b.MemberID = a.FromMemberID
            WHERE a.ToMemberID = @ToMemberID
            AND a.ToDeletedFlag = 0
            AND a.OnHold = 0
            AND a.ToArchivedFlag = 0
            AND a.FromDeletedFlag = 0
        )
        SELECT * FROM InMailsCDDESC
        WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize
    END

Any help you can provide would be greatly appreciated. Many thanks, Paul

Upvotes: 1

Views: 203

Answers (2)

user330315
user330315

Reputation:

If you want a specific order you need to use an ORDER BY in your SELECT statement.

As you don't specify an ORDER BY in your SELECT statement, the database is free to return the rows in any order it likes.

Edit

I'm adding Lamak's comment to make this answer complete:

The ORDER BY in the definition of the window for row_number() is only used to to calculate result of the row_number() function. It is not used to sort the overall result (which is part of the beauty of windowing functions)

To order by the calculated row_number() you need to add an ORDER BY RowNum to the final SELECT statement.

Upvotes: 5

Rich Andrews
Rich Andrews

Reputation: 4188

I believe you need to add the orderby in your final select statement, possibly order by rownum?

Upvotes: 0

Related Questions