oracle PL / SQL:按问题排序

时间:2012-05-29 13:03:30

标签: sql oracle sorting

  

可能重复:
  oracle PL/SQL: sort rows

我运行此查询:

 Select a.product, sum(
     case 
       when b.id=1 then round(c.sales,3)
       else 0 
     end) as Q1_2008,
 sum(
     case 
         when b.id=2 then round(c.sales,3) 
         else 0 
     end) as Q2_2008,
 sum(
     case
         when b.id=3 then round(c.sales,3) 
         else 0
     end) as Q3_2008
 from products a, quarters b, sales c
 where 
    a.id=c.PRODUCT_ID and 
    b.id=c.QUARTER_ID 
 group by a.product
 order by product

但我的产品列不合适。

产品

PROD_1
PROD_10
PROD_2
PROD_3
PROD_4
PROD_5
PROD_6
PROD_7
PROD_8
PROD_9

PROD_10是应该在结尾的第二行。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:5)

这是有条不紊的。数字和字符串的排序方式不同。

11在字符串中小于2,因此produect_10放在product_2之前。如果您希望按字符串中的数字排序,则必须将该数字拉出并将其自身排序为数字。

答案 1 :(得分:1)

使用substr来挑选字符串的数字部分。

使用to_number将其变为数字

按此排序。

答案 2 :(得分:1)

以下是执行所需操作的“order by”语句的示例:

order by cast(substr(product, 5, 100) as int)

答案 3 :(得分:0)

如果你真的必须使用字符串(考虑到几分钟之前已经问过同样的问题),那么你可能需要去一些拜占庭分裂/转换路线。即,在_之前取出子串,将其扔掉,将剩余部分转换为整数,然后按顺序排序。我不想保证它是一种可持续的解决方案。

答案 4 :(得分:0)

Limey所说的是正确的。如果要正确排序名称,则重命名字符串,使其填充0 ...例如PROD_01,PROD_01,PROD_02,PROD_03,PROD_10。这样一切都将按顺序进行。

else split,to_number然后订购产品的数字部分。(这只适用于你有通用字符串作为产品名称的前缀)