use*_*104 5 sql sql-server sql-order-by
我想订购SQL选择查询,其中有2个字段在顺序中.然后我需要决定一个是降序而另一个是升序.怎么做
我想要的东西:
Select * from Customer
Order By Date @asc_or_Desc_date, Name @asc_or_Desc_name
Run Code Online (Sandbox Code Playgroud)
有人有任何想法吗?
我试过这个,但似乎失败了
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
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何排序这个?
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
Run Code Online (Sandbox Code Playgroud)
我不想在许多不同的组合中做到这一点.如果你有很多组合,我会根据以下内容做一些...
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
Run Code Online (Sandbox Code Playgroud)
根据需要重复多次......
注意:仅仅因为它可以这样做,并不意味着它应该以这种方式完成.
您必须动态创建 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
Run Code Online (Sandbox Code Playgroud)
这将排序 DateDESCENDING和 Name ASCENDING。
DESC仅当您想使用默认DESCENDING值时才需要添加ASCENDING。