ORDER BY子句在视图,内联函数,派生表,子查询中无效 - 顶部应该在哪里?

时间:2014-08-09 18:19:04

标签: sql-server

我收到了这个错误:

ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效,除非还指定了TOP或FOR XML

来自此查询:

(SELECT Z.dMonth,Z.dCount FROM (
 SELECT COUNT(*) dCount, month(tblDiving.date_of_diving) as dMonth
 FROM tblDiving
 GROUP BY month(tblDiving.date_of_diving) 
)Z
ORDER BY Z.dCount)

我理解我需要在此查询的某处添加“Top”,但在哪里? 最后,此查询需要返回最大dCount和此dCount的月份。

编辑:

This is my query:
select tblSite.name,tblSite.site_length,tblSite.site_depth,tblSite.water_type,tblSite.country,
COUNT(distinct tblDivingClub.number) as number_of_clubs,
COUNT(distinct tblDiving.diving_number) as number_of_divings,
COUNT(distinct tblDiving.guide) as number_of_guids,
sum(tblDiving.number_of_divers) as number_of_divers,
(SELECT top 1 Z.dMonth,Z.dCount FROM (
 SELECT COUNT(*) dCount, month(tblDiving.date_of_diving) as dMonth
FROM tblDiving 
GROUP BY month(tblDiving.date_of_diving) 
 )Z
ORDER BY Z.dCount)
from tblCountry inner join
tblSite on tblCountry.name=tblSite.country
inner join tblDiving on tblSite.name = tblDiving.diving_site
inner join tblDivingClub on tblDiving.diving_club = tblDivingClub.number
where tblSite.name in(select tblSite.name from tblSite where tblSite.country = 'Greece' ) and 
tblDiving.date_of_diving >= DATEADD(year,-1, GETDATE())
group by tblSite.name,tblSite.site_length,tblSite.site_depth,tblSite.water_type,tblSite.country

现在错误是:当EXISTS没有引入子查询时,只能在选择列表中指定一个表达式

3 个答案:

答案 0 :(得分:1)

我认为这应该有用

SELECT Z.dMonth
  ,Z.dCount
FROM (
SELECT COUNT(*) dCount
    ,month(tblDiving.date_of_diving) AS dMonth
FROM tblDiving
GROUP BY month(tblDiving.date_of_diving)
HAVING COUNT(*) = (
        SELECT MAX(A.Count)
        FROM (
            SELECT COUNT(*) Count
                ,tblDiving.date_of_diving
            FROM tblDiving
            GROUP BY tblDiving.date_of_diving
            ) A
        )
) Z

答案 1 :(得分:0)

为什么不这样做:

SELECT TOP(1) COUNT(*) AS dCount, MONTH(tblDiving.date_of_diving) AS dMonth
FROM tblDiving
GROUP BY MONTH(tblDiving.date_of_diving)
ORDER BY dCount

答案 2 :(得分:0)

Microsoft在此解释 - http://support.microsoft.com/kb/841845

来自文档 -

“在视图,内联函数,派生表或子查询中使用ORDER BY子句时,它不保证有序输出。而是,ORDER BY子句仅用于保证结果集由Top运算符生成的具有一致的组成.Order BY子句仅在最外层的SELECT语句中指定时保证有序的结果集。“

在您的情况下,如果您想要退回所有内容,可以选择前100%,如果您需要,则可以选择前1名。

(SELECT TOP 1 Z.dMonth,Z.dCount FROM (
 SELECT COUNT(*) dCount, month(tblDiving.date_of_diving) as dMonth
 FROM tblDiving
 GROUP BY month(tblDiving.date_of_diving) 
)Z
ORDER BY Z.dCount)