【问题标题】:how to order 2 SQL Fields in asc and desc dynamically如何在 asc 和 desc 中动态排序 2 个 SQL 字段
【发布时间】:2011-02-14 14:20:22
【问题描述】:

我想订购一个 SQL 选择查询,其中有 2 个按顺序排列的字段。然后我需要决定一个是下降的,另一个是上升的。这是怎么做到的

我想要类似的东西:

Select * from Customer
Order By Date @asc_or_Desc_date, Name @asc_or_Desc_name

有人有什么想法吗?

我试过了,但似乎失败了

SELECT 

    Customer_ID,                        
    Name,                               
    Age                                         

FROM #Customer
ORDER BY 

    CASE WHEN @fieldSort ='Name'
        THEN ROW_NUMBER() over (order by Name) * 
            case when @directionOfSort = 'A' 
                THEN 1 ELSE -1 END,
             ROW_NUMBER() over (order by Age) * 
            case when @directionOfSort = 'A' 
                THEN 1 ELSE -1 END,
        END

有人知道如何排序吗?

【问题讨论】:

  • 如果您要为您的问题添加更多详细信息,请尽量避免我们的答案因此而变得无关紧要。如果您认为这很可能,最好发布一个新问题,如果需要,可以参考这个问题。

标签: sql sql-server sql-order-by


【解决方案1】:
SELECT 
  Customer_ID,                        
  Name,                               
  Age                                         
FROM
  #Customer
ORDER BY 
  CASE WHEN @field = 'Name' AND @direction = 'A' THEN Name ELSE NULL END ASC,
  CASE WHEN @field = 'Name' AND @direction = 'D' THEN Name ELSE NULL END DESC,
  CASE WHEN @field = 'Age'  AND @direction = 'A' THEN Age  ELSE NULL END ASC,
  CASE WHEN @field = 'Age'  AND @direction = 'D' THEN Age  ELSE NULL END DESC


不过,我不想在许多不同的组合中这样做。如果你有很多组合,我会根据以下内容做一些事情......

SELECT 
  Customer_ID,                        
  Name,                               
  Age                                         
FROM
(
  SELECT
    Customer_ID,
    Name,
    ROW_NUMBER() OVER (ORDER BY Name) AS "name_order",
    Age,
    ROW_NUMBER() OVER (ORDER BY Age)  AS "age_order"
  FROM
    #Customer
)
  AS [data]
ORDER BY 
  CASE @field1
    WHEN 'Name' THEN CASE @direction1 WHEN 'A' THEN name_order ELSE -name_order END
    WHEN 'Age'  THEN CASE @direction1 WHEN 'A' THEN age_order  ELSE -age_order  END
    ELSE NULL
  END,
  CASE @field2
    WHEN 'Name' THEN CASE @direction2 WHEN 'A' THEN name_order ELSE -name_order END
    WHEN 'Age'  THEN CASE @direction2 WHEN 'A' THEN age_order  ELSE -age_order  END
    ELSE NULL
  END

根据需要重复多次...


注意:可以这样,不代表就应该这样。

【讨论】:

  • +1 为第一个,即使它更麻烦,因为第二个仅按一列排序,而 OP 似乎希望它按两列。
  • 问题 syas Name Age 和 Asc Desc?虽然我可能只是失明,但这并不少见......
  • 相同的逻辑,但稍作重构,以明确如何扩展到多个订单。
【解决方案2】:

您必须动态创建 SQL 语句才能使用变量:

DECLARE @asc_desc VARCHAR(4);

SET @asc_desc = 'DESC';

DECLARE @sql NVARCHAR(1000);

SET @sql = 'Select * from Customer Order By Date ' + @asc_desc + ', Name';

EXEC sp_executesql @sql

这将订购日期DESCENDING 和名称ASCENDING

如果你想使用DESCENDING,你只需要添加DESC,因为ASCENDING是默认的。

【讨论】:

  • sp_execute 在这种情况下需要EXEC
  • @Andriy M:是的,我试图在 SSMS 中运行代码并纠正问题。
  • 注意:执行此操作时要非常注意 SQL 注入。参数需要由您自己的代码提供,和/或值需要验证。如果您在存储过程中进行此操作,请在存储过程中检查它们,以确保。
【解决方案3】:

在 SQL Server 2005+ 中,您可以使用以下设备:

WITH CustomerCTE AS (
  SELECT
    *,
    DateSort = ROW_NUMBER() OVER (ORDER BY Date),
    NameSort = ROW_NUMBER() OVER (ORDER BY Name)
  FROM Customer
)
SELECT *
FROM CustomerCTE
ORDER BY DateSort * @DateSortDir, NameSort * @NameSortDir

这种情况下的变量应该是1-1


编辑

另外发布的示例似乎暗示在 ORDER BY 中使用的列顺序也应该是动态的。而且现在看来,两列的顺序方向都是统一指定的。

不管是不是这样(问题变得有点模棱两可),我的第二个解决方案都假设了。

DECLARE @IntSortDir int;
SET @IntSortDir = CASE @directionOfSort WHEN 'A' THEN 1 ELSE -1 END;

WITH CustomerCTE AS (
  SELECT
    Customer_ID,
    Name,
    Age,
    NameSort = ROW_NUMBER() OVER (ORDER BY Name),
    AgeSort  = ROW_NUMBER() OVER (ORDER BY Date)
  FROM Customer
)
SELECT
  Customer_ID,
  Name,
  Age
FROM CustomerCTE
ORDER BY
  CASE @fieldSort WHEN 'Age' THEN AgeSort END * @IntSortDir,
  NameSort * @directionOfSort,
  CASE @fieldSort WHEN 'Name' THEN AgeSort END * @IntSortDir

@fieldSort 指定主订单列。另一个自动成为次要的。

【讨论】:

  • SELECT EXT_Design_Standard_ID Standards_Name Ref FROM #LastUpdateTemp --ORDER BY Date_Changed DESC ORDER BY CASE WHEN @fieldSort ='Standards Name' THEN ROW_NUMBER() over (order by Standards_Name) * case when @directionOfSort = 'A ' THEN 1 ELSE -1 END, ROW_NUMBER() over (order by Ref) * case when @directionOfSort = 'A' THEN 1 ELSE -1 END, END,
  • 地雷问题失败了,知道如何排序吗?
  • 您的意思是,您不仅希望排序方向是动态的,还希望ORDER BY 列的顺序也是?
  • 我设法完成了排序的第一部分,但是当涉及到时
【解决方案4】:
Here is the solution

Explanation:
1. Ordering the row number on the basis of SQL input param  order by (DESC, ASC)
2. Againt ordering the row number in outer query

Try this code (working)

DECLARE @PageNum int
DECLARE @PageSize int
DECLARE @TotalRowsNum int
DECLARE @SortColumn varchar(200)
DECLARE @SortOrder varchar(5)

SET @PageNum = 4;
SET @PageSize = 10;
SET @SortColumn = 'CODE_ID';
SET @SortOrder = 'DESC';

WITH QueryResult AS
(

SELECT *,
CASE @SortOrder WHEN 'ASC' THEN
ROW_NUMBER() OVER(ORDER BY @SortColumn ASC) 
ELSE
ROW_NUMBER() OVER(ORDER BY @SortColumn DESC) 
END AS 'RowNumber'

FROM TABLE_NAME 
) 
SELECT * FROM QueryResult
WHERE RowNumber BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize
ORDER BY RowNumber ASC 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2011-12-17
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多