0

重複の可能性:
oracle PL / SQL:行のソート

私はこのクエリを実行します:

 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は、最後にあるはずの2番目の行です。どうすればこれを修正できますか?

4

5 に答える 5

5

それは順調です。数字と文字列の順序は異なります。

11は文字列内で2未満であるため、produect_10はproduct_2の前に配置されます。文字列内の数値で並べ替える場合は、その数値を引き出して、それ自体を数値として並べ替える必要があります。

于 2012-05-29T13:07:08.207 に答える
1

substrを使用して、文字列の数値部分を選択します。

to_numberを使用して数値に変換します

それで並べ替えます。

于 2012-05-29T13:12:20.147 に答える
1

これは、必要なことを実行する「orderby」ステートメントの例です。

order by cast(substr(product, 5, 100) as int)
于 2012-05-29T13:34:06.400 に答える
0

本当に文字列を使用する必要がある場合(この同じ質問が数分前に尋ねられた場合)、ビザンチンの分割/変換ルートを使用する必要がある場合があります。つまり、_の前の部分文字列を取得し、それをチャックして、残りの部分を整数に変換し、その順に並べます。しかし、それが持続可能な解決策であることを保証したくはありません。

于 2012-05-29T13:11:14.137 に答える
0

Limeyが言ったことは正しいです。名前を正しく並べ替える場合は、文字列の名前を変更して、0が埋め込まれるようにします。たとえば、PROD_01、PROD_01、PROD_02、PROD_03、PROD_10などです。このようにして、すべてが整頓されます。

それ以外の場合は、split、to_number、次に製品の番号部分を注文します(これは、製品名としてプレフィックスとして共通の文字列がある場合にのみ機能します)

于 2012-05-29T13:14:17.923 に答える