I was having a problem this morning in using a ORDER BY in UNION Clause. The solution is to use keyword of “TOP 100 PERCENT” on the related ORDER BY SELECT query.
CREATE PROCEDURE MyAPLRank
@MemberID int
AS
SET NOCOUNT ON;
BEGIN
SELECT r.ResultName,r.PlayerOfTheYearID,r.MemberID,r.RankID,r.memberCode,
r.FirstName,r.Surname,r.State,r.NumEvents,r.Points,r.AvgPoints,
r.MeetsRequirements,r.Valid,r.IsLeaderBoard,r.RowNum
FROM
(
SELECT
'Player of The Year' As ResultName,PlayerOfTheYearID,MemberID,
RankID,memberCode,FirstName,Surname,State,NumEvents,Points,
AvgPoints,MeetsRequirements,Valid,'0' as IsLeaderBoard,1 as RowNum
FROM
PlayerOfTheYearQuery
WHERE
PlayerOfTheYearID
=
(
SELECT
TOP 1 poy.PlayerOfTheYearID
FROM
PlayerOfTheYear poy
INNER JOIN
Schedule s
ON
(s.ScheduleID = poy.ScheduleID)
WHERE
(s.MonthID IS NULL AND s.WeekID IS NULL AND s.QuarterID IS NULL)
ORDER BY
s.ScheduleID
DESC
) AND MemberID = @MemberID AND MeetsRequirements = 1
UNION
SELECT
'Player of The Month' As ResultName,PlayerOfTheYearID,MemberID,
RankID,memberCode,FirstName,Surname,State,NumEvents,Points,
AvgPoints,MeetsRequirements,Valid,'0' as IsLeaderBoard,2 as RowNum
FROM
PlayerOfTheYearQuery
WHERE
PlayerOfTheYearID
=
(
SELECT
TOP 1 poy.PlayerOfTheYearID
FROM
PlayerOfTheYear poy
INNER JOIN
Schedule s
ON
(s.ScheduleID = poy.ScheduleID)
WHERE
(s.MonthID IS NOT NULL AND s.WeekID IS NULL)
ORDER BY
s.ScheduleID
DESC
) AND MemberID = @MemberID AND MeetsRequirements = 1
UNION
SELECT
'Player of The Week' As ResultName,PlayerOfTheYearID,MemberID,
RankID,memberCode,FirstName,Surname,State,NumEvents,Points,
AvgPoints,MeetsRequirements,Valid,'0' as IsLeaderBoard,3 as RowNum
FROM
PlayerOfTheYearQuery
WHERE
PlayerOfTheYearID
=
(
SELECT
TOP 1 poy.PlayerOfTheYearID
FROM
PlayerOfTheYear poy
INNER JOIN
Schedule s
ON
(s.ScheduleID = poy.ScheduleID)
WHERE
(s.MonthID IS NOT NULL AND s.WeekID IS NOT NULL)
ORDER BY
s.ScheduleID
DESC
) AND MemberID = @MemberID AND MeetsRequirements = 1
UNION
SELECT TOP 100 PERCENT
v.venue As ResultName,l.leaderboardID as PlayerOfTheYearID,lq.MemberID,
lq.RankID,lq.membercode,lq.name as FirstName,lq.name as Surname,s.State,
lq.NumEvents,lq.Points,lq.points as AvgPoints,lq.valid as MeetsRequirements,
lq.Valid, '1' as IsLeaderBoard,4 as RowNum
FROM
leaderboardquery lq
INNER JOIN
leaderboard l
ON
(
l.leaderboardid = lq.leaderboardid
AND
l.venueid IS NOT NULL
AND
lq.MemberID = @MemberID
AND
l.scheduleID =
(
SELECT ScheduleID
FROM Schedule
WHERE GETDATE() BETWEEN FromDate AND ToDate
AND MonthID IS NOT NULL
)
)
INNER JOIN
venues v
ON
(v.venueID = l.venueid)
INNER JOIN
states s
ON
l.StateID = s.StateID
ORDER BY
l.ScheduleID
DESC
) r
ORDER BY
RowNum
END
Leave a Reply