【问题标题】:how to use a customised sort order in sql如何在sql中使用自定义排序顺序
【发布时间】:2014-06-21 03:36:54
【问题描述】:

我想不按 asc 或 desc 对列进行排序,但我希望它按照我设置的顺序排序。例如我有这个数据:

Varchar1 |  Varchar2 | Value | Something
1401_1   | 1401_1_9  | 1     | Something1
1401_1   | 1401_1_9  | 0     | Something2
1401_1   | 1401_1_11 | 1     | Something1
1401_1   | 1401_1_11 | 1     | Something2
1401_1   | 1401_1_13 | 0     | Something1
1401_1   | 1401_1_13 | 1     | Something2
1401_1   | 1401_1_15 | 0     | Something1
1401_1   | 1401_1_15 | 1     | Something2
1401_1   | 1401_1_17 | 1     | Something1
1401_1   | 1401_1_17 | 0     | Something2
1401_1   | 1401_1_19 | 1     | Something1
1401_1   | 1401_1_19 | 0     | Something2
1401_1   | 1401_1_21 | 1     | Something1
1401_1   | 1401_1_21 | 1     | Something2
1401_1   | 1401_1_23 | 0     | Something1
1401_1   | 1401_1_23 | 1     | Something2
1401_1   | 1401_1_1  | 0     | Something1
1401_1   | 1401_1_1  | 1     | Something2
1401_1   | 1401_1_3  | 1     | Something1
1401_1   | 1401_1_3  | 0     | Something2
1401_1   | 1401_1_5  | 1     | Something1
1401_1   | 1401_1_5  | 0     | Something2
1401_1   | 1401_1_7  | 1     | Something1
1401_1   | 1401_1_7  | 1     | Something2

这是我的代码:

SELECT * 
FROM (SELECT TOP 12 
            [varchar2] AS [T2], 
            SUM(CASE WHEN [Type] = 'something1' THEN value END) AS something1, 
            SUM(CASE WHEN [Type] = 'something2' THEN value END) AS [something2] 
    FROM tbl_table 
    GROUP by [varchar2] 
    ORDER by [varchar2] DESC)x 
ORDER BY [T2] ASC

该代码产生如下内容:1401_1_1、1401_1_11、1401_1_13、1401_1_15、1401_1_17、 1401_1_19, 1401_1_21, 1401_1_23, 1401_1_3, 1401_1_5, 1401_1_7, 1401_1_9 ==> 它在 varchar 中排序

我希望它按照这个顺序排序:1401_1_9, 1401_1_11, 1401_1_13, 1401_1_15, 1401_1_17, 1401_1_19, 1401_1_21, 1401_1_23, 1401_1_1, 1401_1_1, 1401_1_3, 1401_1_5_1_3, 01_1_7

有可能吗?

【问题讨论】:

  • 第二个和第三个数字不能补零吗,例如 1401_01_01、1401_01_09 等?
  • 添加一个订单列,按照您想要的顺序设置它,然后按此对结果进行排序。
  • @intracept 感谢您的建议,但我认为它仍然按照我想要的顺序执行,例如:01、03、05、07...。我希望它是:09, 11, ......, 01, 03.... 类似的东西。
  • @dbugger 感谢 dbugger 的建议。我先试试看。

标签: c# asp.net sql sql-server vb.net


【解决方案1】:

您可以使用以下代码:

Order by PARSENAME(REPLACE(@varchar2,'_','.'),3),
         PARSENAME(REPLACE(@varchar2,'_','.'),2),
         CASE WHEN PARSENAME(REPLACE([varchar2],'_','.'),1)>=9 THEN 1 ELSE 2 END,
         PARSENAME(REPLACE(@varchar2,'_','.'),1)

【讨论】:

  • 感谢您的建议。我试过了,但它给了我一个错误:从字符串转换日期和/或时间时转换失败。
  • 您必须具有标准的日期格式并且必须将“_”替换为“-”才能将您的字段转换为日期。
  • 但是如果我对它进行排序,它将根据 1、2、3、4 ..... 类似的东西对吗?
  • 当然。根据您的想法进行升序或降序排序。
  • 但我希望它是这样的:9,11,13,15,.... 1,3,5...这就是问题...我仍在尝试 dbugger 建议通过在表中添加另一个 ordercolumn...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多