仅对 ORDER BY 子句中的第一列进行排序

Pan*_*tea 4 sql-server order-by t-sql

似乎我误解了“订购”的概念。

我有一个包含这种结构和数据的表:

CREATE TABLE TestTest (Value1 Int, Value2 Int);

INSERT INTO TestTest VALUES
(1, 10),
(2, 9),
(3, 8),
(4, 7),
(5, 6),
(6, 5),
(7, 4),
(8, 3),
(9, 2),
(10, 1)
;
Run Code Online (Sandbox Code Playgroud)

使用以下查询:

Select Value1 , Value2
from TestTest
order by Value1 desc,Value2 desc
Run Code Online (Sandbox Code Playgroud)

我期望两列Value1Value2从 10 到 1,因为我DESC用于两列。

但我看到这个输出:

Value1 按降序排列,Value2 不

为什么不是Value2降序排列?

Mic*_*utz 25

您正在对数据行进行排序,而不是对每一列分别进行排序。

由于您的ORDER BY子句,行 (10, 1) 出现在行 (1, 10) 之前。

Value2只进场时,有第一列领带。

正如Hellion进一步解释的那样,就数据库而言,对 (10, 1) 是一个不可分割的单位:它不是两个值,而是一个集合(恰好包含两个值)。您不能只是将集合分成几部分,然后随意地将这些部分交换成不同的集合。正如我所说(并且正如 Darko 在另一个答案中所示),该ORDER BY子句按第一个指定的列 ( Value1) 进行排序,然后如果 中有多个具有相同编号的行Value1,它会按 对该行子集进行排序Value2

作为另一个说明,您还可以考虑AC建议的示例:

另请参阅字典对单词的排序方式:AA、AB、AC、BA、BB、BC、CA、CB、CC...现在将第一个字母替换为您的第一列值(即使它超过一个数字)和带有第二列值的第二个字母就可以了 - 相同的原则。(是的,为了清楚起见,我对 ASCending 进行了排序——很难找到 DESCending 排序的字典。)


小智 12

例如,如果您有多行的 value1 等于 10,那么 ORDER 子句的第二部分将按您的预期进行。

考虑以下代码段,其中存在三行的 value1 等于 10。

DECLARE @test AS TABLE
( 
                       value1 int, value2 int
);

INSERT INTO @test
VALUES( 10, 1 ), ( 9, 2 ), ( 8, 3 ), ( 7, 4 ), ( 6, 5 ), ( 5, 6 ), ( 4, 7 ), ( 3, 8 ), ( 2, 9 ), ( 1, 10 ), ( 10, 2 ), ( 10, 3 );

SELECT *
FROM @test
ORDER BY value1 DESC, value2 DESC;
Run Code Online (Sandbox Code Playgroud)

输出如下图所示。

在此处输入图片说明

有关SELECT - ORDER BY 子句 (Transact-SQL) 的更多信息


小智 7

让我们使用一个更具说明性的例子。

创建一个包含一些虚拟数据的表:

CREATE TABLE [PurchaseHistory](
    [CustomerName] VARCHAR(50),
    [Item] VARCHAR(50),
    [Quantity] INTEGER
);

INSERT INTO [PurchaseHistory]
([CustomerName],[Item],[Quantity])
VALUES
('ZZ Top','Shampoo (Beard Wash) 16oz',3),
('ABC Stores','Fruit Punch 8oz',30),
('Nicolas Cage','Beekeeper suit',1);
Run Code Online (Sandbox Code Playgroud)

虚拟数据

如果您使用 Item/Quantity DESC 选择此选项,您希望得到什么?

SELECT [CustomerName],[Item],[Quantity]
FROM [PurchaseHistory]
ORDER BY
    [CustomerName] ASC,
    [Item] DESC,
    [Quantity] DESC
;
Run Code Online (Sandbox Code Playgroud)

对于您问题中的示例,您似乎希望它是这样的: 清洁胡须

现在突然你的记录显示 ABC 商店买了 30 瓶 Beard Wash,有一天尼古拉斯凯奇有点口渴,ZZ Top 正在他们之间共用一套蜜蜂套装。

相反,当使用 ORDER BY 时,一行中的值保持在一起,从而得到正确的数据集,其中 ABC 商店仍在购买 30 瓶果汁饮料,Nick Cage 穿上他的养蜂人套装,而 ZZ Top 继续留着干净的面部毛发.

无聊的