使用的程序:
SQL Server 2000,Excel 2003
我们的数据库中有一个名为Samples的表。使用以下查询...
SELECT [Sample], [Flag] FROM Samples
ORDER BY [Sample]
...我们得到以下结果:
Sample Flag
---------- ----
12-ABC-345 1
123-45-AB 0
679-ADC-12 1
当用户在Excel电子表格中具有相同的数据并按Sample列排序时,他们会得到以下排序顺序:
Sample Flag
---------- ----
123-45-AB 0
12-ABC-345 1
679-ADC-12 1
出于好奇,为什么SQL和Excel中的排序之间存在差异(除了“因为它是Microsoft”)。
SQL中是否有一种方法可以在与Excel方法相同的方法中对Sample列进行排序,反之亦然?
答案 0 :(得分:6)
SQL Server排序由数据库,表或字段排序规则确定。默认情况下,这是一个标准的词典字符串排序(连字符的字符代码在数字上低于1的字符代码)。不幸的是,根据this Microsoft link,Excel 在排序时会忽略连字符和撇号,但打破平局除外。没有任何整理可以做到这一点(我知道),所以你必须假装它。
要在SQL Server中实现相同的结果,您需要执行以下操作:
SELECT [Sample], [Flag] FROM Samples
ORDER BY REPLACE(REPLACE([Sample], '-', ''), '''', ''),
(CASE WHEN CHARINDEX([Sample], '-') > 0 THEN 1 ELSE 0 END) +
(CASE WHEN CHARINDEX([Sample], '''') > 0 THEN 1 ELSE 0 END) ASC
这会按字符串对结果进行排序,就好像它已删除所有连字符和撇号一样,然后按计算值排序,对于包含连字符或的任何值,将产生1
撇号,或2
表示任何包含两者的值(和0
表示不包含这两者的值)。此表达式将导致包含连字符和/或撇号的任何值在表达式之后进行排序,否则该表达式与Excel等效。
答案 1 :(得分:3)
我个人认为SQL Server排序顺序正确,我会干预Excel,因为它是遵循“不寻常”方法的那个(至少从我的经验来看)。
以下是Excel如何对字母数字数据进行排序以及如何修复它的说明:How to correctly sort alphanumeric data in Excel。