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)
我期望两列Value1
和Value2
从 10 到 1,因为我DESC
用于两列。
但我看到这个输出:
为什么不是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 继续留着干净的面部毛发.
归档时间: |
|
查看次数: |
3524 次 |
最近记录: |