Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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-OVER和ORDERBY_Sql_Sql Server_Window Functions - Fatal编程技术网

SQL-OVER和ORDERBY

SQL-OVER和ORDERBY,sql,sql-server,window-functions,Sql,Sql Server,Window Functions,我不太明白,我想澄清这是什么,我认为它是什么 如果我提供了排序类型、记录状态和会议日期: 我想按默认会议日期排序。 当排序类型为2时,我想按状态排序,然后按会议日期排序 下面的代码可以做到这一点吗?我的测试表明确实如此,但我可能遗漏了什么 SELECT Foo.*, ROW_NUMBER() OVER ( ORDER BY CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC,

我不太明白,我想澄清这是什么,我认为它是什么

如果我提供了排序类型、记录状态和会议日期:

我想按默认会议日期排序。 当排序类型为2时,我想按状态排序,然后按会议日期排序

下面的代码可以做到这一点吗?我的测试表明确实如此,但我可能遗漏了什么

SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC,
            Foo.MeetingDate DESC
    ) AS RowOrder
更具体地说,如果@SortType为1,那么认为代码分解为:

SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            ASC,
            Foo.MeetingDate DESC
    ) AS RowOrder
我认为这可以分解为:

SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            Foo.MeetingDate DESC
    ) AS RowOrder
与(当@SortType为2时)相反:


CASE@SortType WHEN 2 THEN Foo.FK_Status END
相当于
CASE@SortType WHEN 2 THEN Foo.FK_Status ELSE NULL END
。换句话说,如果@SortType=1,则有效的查询如下:

SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            NULL ASC,
            Foo.MeetingDate DESC
    ) AS RowOrder

RowOrder
列将按所述顺序排列,但如果查询末尾没有
orderby
子句,则无法保证行的排序顺序

因此:

-可以以任何顺序出现,同时:

SELECT Foo.*
FROM Foo
ORDER BY CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, Foo.MeetingDate DESC;
-将按所述排序顺序对输出排序(不包括RowOrder列)

SELECT Foo.*,
       ROW_NUMBER() OVER (ORDER BY 
                          CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC,
                          Foo.MeetingDate DESC) AS RowOrder
FROM Foo;
SELECT Foo.*
FROM Foo
ORDER BY CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, Foo.MeetingDate DESC;