Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 在派生表中执行包含ORDERBY子句的自定义排序_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 在派生表中执行包含ORDERBY子句的自定义排序

Sql 在派生表中执行包含ORDERBY子句的自定义排序,sql,sql-server,tsql,Sql,Sql Server,Tsql,我面临着一个复杂的情况,我知道可以解决这个问题的方法,但是派生表中的ORDERBY子句弄乱了自定义排序。以下是我的输入和输出详细信息以及我尝试过的内容 模式:- 输入:- CREATE TABLE Test( Rowname VARCHAR(10), Col1 DATETIME, Col2 DATETIME, Col3 DATETIME, Col4 DATETIME ); INSERT INTO Test VALUES( 'Row1', '2016-01-14', '2016-

我面临着一个复杂的情况,我知道可以解决这个问题的方法,但是派生表中的ORDERBY子句弄乱了自定义排序。以下是我的输入和输出详细信息以及我尝试过的内容

模式:- 输入:-

  CREATE TABLE Test( Rowname VARCHAR(10), Col1 DATETIME, Col2 DATETIME, Col3 DATETIME, Col4 DATETIME );

      INSERT INTO Test VALUES( 'Row1', '2016-01-14', '2016-01-08', '2016-01-30', '2016-01-01' );
      INSERT INTO Test VALUES( 'Row2', '2016-01-02', '2016-01-01', '2016-01-18', '2016-01-15' );
RowName    Result
Row1       Col4,Col2,Col1,Col3
Row2       Col2,Col1,Col4,Col3
预期输出:-

  CREATE TABLE Test( Rowname VARCHAR(10), Col1 DATETIME, Col2 DATETIME, Col3 DATETIME, Col4 DATETIME );

      INSERT INTO Test VALUES( 'Row1', '2016-01-14', '2016-01-08', '2016-01-30', '2016-01-01' );
      INSERT INTO Test VALUES( 'Row2', '2016-01-02', '2016-01-01', '2016-01-18', '2016-01-15' );
RowName    Result
Row1       Col4,Col2,Col1,Col3
Row2       Col2,Col1,Col4,Col3
我试过什么?

WITH CTE(RowName,Colmn,RN) AS
(
SELECT RowName,Colmn,ROW_NUMBER() OVER( PARTITION BY RowName ORDER BY RowName )  AS RN 
         FROM
            ( 
              ( SELECT RowName,Col1 AS Col,'Col1' AS Colmn FROM Test )
                UNION ALL
              ( SELECT RowName,Col2 AS Col,'Col2' AS Colmn FROM Test )
                UNION ALL
              ( SELECT RowName,Col3 AS Col,'Col3' AS Colmn FROM Test )
                UNION ALL
              ( SELECT RowName,Col4 AS Col,'Col4' AS Colmn FROM Test )
             )  Z 
        ORDER BY RowName,Col 
)
SELECT RowName,
       MAX( ( CASE WHEN RN = 1 THEN Colmn END ) )  + ',' +
       MAX( ( CASE WHEN RN = 2 THEN Colmn END ) ) + ',' +
       MAX( ( CASE WHEN RN = 3 THEN Colmn END ) ) + ',' +
       MAX( ( CASE WHEN RN = 4 THEN Colmn END ) ) AS Result
  FROM CTE
GROUP BY RowName;
注意:-

  CREATE TABLE Test( Rowname VARCHAR(10), Col1 DATETIME, Col2 DATETIME, Col3 DATETIME, Col4 DATETIME );

      INSERT INTO Test VALUES( 'Row1', '2016-01-14', '2016-01-08', '2016-01-30', '2016-01-01' );
      INSERT INTO Test VALUES( 'Row2', '2016-01-02', '2016-01-01', '2016-01-18', '2016-01-15' );
RowName    Result
Row1       Col4,Col2,Col1,Col3
Row2       Col2,Col1,Col4,Col3

内部查询/派生表中的ORDER BY RowName,Col子句失败,因为SQL Server中不允许该子句。如果到那时我还没有使用这个ORDER,我如何在不使用ORDER BY子句的情况下执行自定义排序?

如果您在ORDER BY的行号中添加col,它将按照您想要的方式排序

ROW_NUMBER() OVER( PARTITION BY RowName ORDER BY RowName, col )

应在
over
子句中定义您的
订购人

WITH CTE(RowName,Colmn,RN) AS
(
SELECT 
    RowName,Colmn,ROW_NUMBER() OVER( 
        PARTITION BY RowName 
        ORDER BY RowName, Col       -- add Col here
    ) AS RN 
    FROM
    ( 
      ( SELECT RowName,Col1 AS Col,'Col1' AS Colmn FROM Test )
        UNION ALL
      ( SELECT RowName,Col2 AS Col,'Col2' AS Colmn FROM Test )
        UNION ALL
      ( SELECT RowName,Col3 AS Col,'Col3' AS Colmn FROM Test )
        UNION ALL
      ( SELECT RowName,Col4 AS Col,'Col4' AS Colmn FROM Test )
     )  Z 
    -- ORDER BY RowName,Col -- remove this line
)
SELECT RowName,
       MAX( ( CASE WHEN RN = 1 THEN Colmn END ) )  + ',' +
       MAX( ( CASE WHEN RN = 2 THEN Colmn END ) ) + ',' +
       MAX( ( CASE WHEN RN = 3 THEN Colmn END ) ) + ',' +
       MAX( ( CASE WHEN RN = 4 THEN Colmn END ) ) AS Result
  FROM CTE
GROUP BY RowName;