Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 错误:order by子句在视图中无效_Sql_Sql Server - Fatal编程技术网

Sql 错误:order by子句在视图中无效

Sql 错误:order by子句在视图中无效,sql,sql-server,Sql,Sql Server,我在SQLServer14中遇到以下错误,我试图基于4个表构建一个视图 ORDER BY子句在视图、内联函数和派生函数中无效 表、子查询和常用表表达式(除非为TOP)、偏移量 也为XML指定了or 如何修复下面的错误,以避免出现此错误 SELECT dbo.PS_Proj.[Project ID], case when PS_Proj.[City Name] is not null then concat(PS_Proj.[Cit

我在SQLServer14中遇到以下错误,我试图基于4个表构建一个视图

ORDER BY子句在视图、内联函数和派生函数中无效 表、子查询和常用表表达式(除非为TOP)、偏移量 也为XML指定了or

如何修复下面的错误,以避免出现此错误

SELECT        dbo.PS_Proj.[Project ID],
            case 
            when PS_Proj.[City Name] is not null then  concat(PS_Proj.[City Name], ' ', PS_Proj.[State])
            when PS_Billing.[Location] is not null then max(PS_Billing.[Location])
            when PS_Time.[Labor Location ID] is not null then max(PS_Location.[Labor Location Name])
            else null
            end AS [Location]
FROM        dbo.PS_Location RIGHT OUTER JOIN
                     dbo.PS_Time ON dbo.PS_Location.[Labor Location ID] = dbo.PS_Time.[Labor Location ID] RIGHT OUTER JOIN
                     dbo.PS_Proj ON dbo.PS_Time.[Project ID] = dbo.PS_Proj.[Project ID] LEFT OUTER JOIN
                     dbo.PS_Billing ON dbo.PS_Proj.[Project ID] = dbo.PS_Billing.[Project ID]
ORDER BY    PS_Billing.[T/S Date], PS_Time.[Date]

我希望显示最新的PS_计费位置,如果该位置为空,则显示最新的PS_时间位置

不按顺序创建视图。按PS_账单[T/S日期]、PS_时间[Date]删除订单,并将其添加到您的选择中

SELECT     
PS_Billing.[T/S Date] AS TsDate, 
PS_Time.[Date] AS Date,
 dbo.PS_Proj.[Project ID],
            case 
            when PS_Proj.[City Name] is not null then  concat(PS_Proj.[City Name], ' ', PS_Proj.[State])
            when PS_Billing.[Location] is not null then max(PS_Billing.[Location])
            when PS_Time.[Labor Location ID] is not null then max(PS_Location.[Labor Location Name])
            else null
            end AS [Location]
FROM        dbo.PS_Location RIGHT OUTER JOIN
                     dbo.PS_Time ON dbo.PS_Location.[Labor Location ID] = dbo.PS_Time.[Labor Location ID] RIGHT OUTER JOIN
                     dbo.PS_Proj ON dbo.PS_Time.[Project ID] = dbo.PS_Proj.[Project ID] LEFT OUTER JOIN
                     dbo.PS_Billing ON dbo.PS_Proj.[Project ID] = dbo.PS_Billing.[Project ID] 
并使用“按行排序”从视图中进行选择

Select FROM YOUR_VIEW_NAME as V
Order By V.TsDate, V.Date

创建您的视图而无需按顺序。按PS_账单[T/S日期]、PS_时间[Date]删除订单,并将其添加到您的选择中

SELECT     
PS_Billing.[T/S Date] AS TsDate, 
PS_Time.[Date] AS Date,
 dbo.PS_Proj.[Project ID],
            case 
            when PS_Proj.[City Name] is not null then  concat(PS_Proj.[City Name], ' ', PS_Proj.[State])
            when PS_Billing.[Location] is not null then max(PS_Billing.[Location])
            when PS_Time.[Labor Location ID] is not null then max(PS_Location.[Labor Location Name])
            else null
            end AS [Location]
FROM        dbo.PS_Location RIGHT OUTER JOIN
                     dbo.PS_Time ON dbo.PS_Location.[Labor Location ID] = dbo.PS_Time.[Labor Location ID] RIGHT OUTER JOIN
                     dbo.PS_Proj ON dbo.PS_Time.[Project ID] = dbo.PS_Proj.[Project ID] LEFT OUTER JOIN
                     dbo.PS_Billing ON dbo.PS_Proj.[Project ID] = dbo.PS_Billing.[Project ID] 
并使用“按行排序”从视图中进行选择

Select FROM YOUR_VIEW_NAME as V
Order By V.TsDate, V.Date

在case表达式中有一些聚合数据,而没有分组依据。我在这里做一些猜测。另外,你应该养成使用别名的习惯,这会使事情变得简单很多。我还建议不要在列名中加空格,因为这会迫使您经常将列括在方括号中

像这样的事情应该能让你接近

SELECT p.[Project ID]
    , MAX(case 
        when p.[City Name] is not null then concat(p.[City Name], ' ', p.[State])
        when b.[Location] is not null then b.[Location]
        when t.[Labor Location ID] is not null then l.[Labor Location Name]
        else null
    end) AS [Location]
FROM dbo.PS_Location l
RIGHT OUTER JOIN dbo.PS_Time t ON l.[Labor Location ID] = t.[Labor Location ID] 
RIGHT OUTER JOIN dbo.PS_Proj  p ON t.[Project ID] = p.[Project ID]
LEFT OUTER JOIN dbo.PS_Billing b ON p.[Project ID] = b.[Project ID]
GROUP BY p.[Project ID]

在case表达式中有一些聚合数据,而没有分组依据。我在这里做一些猜测。另外,你应该养成使用别名的习惯,这会使事情变得简单很多。我还建议不要在列名中加空格,因为这会迫使您经常将列括在方括号中

像这样的事情应该能让你接近

SELECT p.[Project ID]
    , MAX(case 
        when p.[City Name] is not null then concat(p.[City Name], ' ', p.[State])
        when b.[Location] is not null then b.[Location]
        when t.[Labor Location ID] is not null then l.[Labor Location Name]
        else null
    end) AS [Location]
FROM dbo.PS_Location l
RIGHT OUTER JOIN dbo.PS_Time t ON l.[Labor Location ID] = t.[Labor Location ID] 
RIGHT OUTER JOIN dbo.PS_Proj  p ON t.[Project ID] = p.[Project ID]
LEFT OUTER JOIN dbo.PS_Billing b ON p.[Project ID] = b.[Project ID]
GROUP BY p.[Project ID]


如果要创建视图,请按移除orber并从“在视图上选择”中排序结果,则您正在尝试创建视图,并且在创建视图时无法应用order by。但是,当从视图中选择时,您可以通过应用您的订单。也许
选择top 100%
?将ORDER BY子句从您的视图中删除。@SeanRange:一些试图聪明的人不使用100%,但使用99.99999999999999:-)如果您正在创建视图,请删除orber并从select on视图中排序结果,,您正在尝试创建视图,但在创建视图时无法应用ORDER BY。但是,当从视图中选择时,您可以通过应用订单。也许
选择top 100%
?将ORDER BY子句从您的视图中删除。@SeanLange:一些试图聪明的人不使用100%,但使用99.99999999999999:-)当我这样做时,我会得到重复的行,因为每个项目id有5到3000个不同的日期或t/S日期。如何在没有所有重复行的情况下执行此操作?这是一个不同的问题,与按错误排序无关。您应该使用“分组依据”对项目进行分组,因为我没有添加[t/S Date]和[Date]的原因是我没有获得与它们相关联的其他行-有意义吗?否则这个解决方案就没有意义了。不幸的是,这不是正确的答案。实际上没有意义。我没有更改您的查询,我只是从您的视图定义中删除了order by。添加新字段以进行选择不会导致重复记录。想想下面的例子。Id名称生日1 Abc 1-1-2001 2 Abcd 2-2-2002从用户名中选择姓名,从用户名中选择姓名,从用户名中选择生日两个结果将有1条记录Id=1当我这样做时,我会得到重复的行,因为每个项目Id有5到3000个不同的日期或T/S日期。如何在没有所有重复行的情况下执行此操作?这是一个不同的问题,与按错误排序无关。您应该使用“分组依据”对项目进行分组,因为我没有添加[t/S Date]和[Date]的原因是我没有获得与它们相关联的其他行-有意义吗?否则这个解决方案就没有意义了。不幸的是,这不是正确的答案。实际上没有意义。我没有更改您的查询,我只是从您的视图定义中删除了order by。添加新字段以进行选择不会导致重复记录。想想下面的例子。Id Name生日1 Abc 1-1-2001 2 Abcd 2-2-2002从用户名中选择姓名,其中Name='Abc'选择姓名,来自用户的生日,其中Name='Abc'两个结果都将有1条记录Id=1I我将case语句添加到group by中,并得到大量错误,这些错误看起来像:“dbo.PS_Proj.City Name”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在group by子句中。如果我像这样单独添加所有内容:group by项目ID、城市名称、州、位置。。。我将得到我正在努力避免的重复的行。在没有重复行的情况下如何进行此操作?不要按其他列分组。它们是聚合的。当我删除应该聚合的行时,我在城市名称上得到了错误,位置和人工位置ID:在选择列表中无效,因为它既不包含在聚合函数中,也不包含在分组依据中clause@TAD我对查询做了一些修改,但我主要是猜测,因为我没有表可以使用。我将case语句添加到groupby中,得到了大量错误,看起来像:“dbo.PS_Proj.City Name”是select列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。如果我像这样单独添加所有内容:GROUP BY Project ID、City Name、State、Location。。。我将得到我正在努力避免的重复的行。在没有重复行的情况下如何进行此操作?不要按其他列分组。它们是聚合的。当我删除应该聚合的行时,我在选择列表中的城市名称、位置和人工位置ID上出现错误:无效,因为它既不包含在聚合函数中,也不包含在GROUP BY中clause@TAD我对查询做了一些修改,但我主要是猜测,因为我没有表可供使用。