可能重复:
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是应该在结尾的第二行。我该如何解决这个问题?
答案 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然后订购产品的数字部分。(这只适用于你有通用字符串作为产品名称的前缀)