2009-07-02 11 views
0

2つの列に分割したいデータが1つの列にあります。データは、カンマで区切られています(存在する場合)。このフィールドにはデータはありません。データには1セットのみ、コンマでは2セットのデータが保存されます。現在、私はデータをプルし、コンマ区切りファイルとして保存し、FoxProを使用してテーブルにデータをロードし、必要に応じてデータを処理し、別のSQLテーブルにデータを再挿入して使用します。私は、FoxPro部分を削除し、SQLクエリを私のためにデータをsaperateしたいと思います。以下は、データがどのように見えるかのサンプルです。私は総額を得るために量フィールドのデータを合計する上記のデータでSQLを2つのフィールドに分割するクエリ

Store Amount Discount 
1  5.95  
1  5.95 PO^-479^2 
1  5.95 PO^-479^2 
2  5.95  
2  5.95 PO^-479^2 
2  5.95 +CA8A09^-240^4,CORDRC^-239^7 
3  5.95  
3  5.95 +CA8A09^-240^4,CORDRC^-239^7 
3  5.95 +CA8A09^-240^4,CORDRC^-239^7 

。次に、カラット文字の間にある特定の割引額を引き出し、合計して合計割引額を取得します。次に、2つを合計して総純額を取得します。私が書いておきたい質問は、必要に応じてディスカウントフィールドを分けていきます.2行目の3行目に2つのディスカウントが適用されていることを確認してから、カラット文字の間の値を取り出してください。

+0

私は、人々がまだFox Proを使用していることに気付きませんでした。 – pjp

+0

birdlips - 私はSQLserverを使用しています。 pjp - 私は実際にFoxProをしばらく使用していて、それを愛しています。私は.netグループが好きで、時にはそれを使うのですが、私の必要性の大部分はFoxProが最良の選択肢でした。 –

答えて

0

SQL Serverの場合: SQL文でChardIndex( '、'、fieldname)を使用すると、コンマの位置を見つけて、最初と2番目のフィールドを解析する部分文字列を見つけることができます。

0

Oracleの場合、選択句では次のようなcase文を使用できます。 2割引のそれぞれに1つを使用します。

CASE WHEN LENGTH(foo.discount) > 0 AND INSTR(foo.discount,',') > 0 THEN 
SUBSTR(foo.discount,1,INSTR(foo.discount,',',1,1)) ELSE foo.discount END AS discount_column_1 
0

私は最終的に、私はそれらを必要に応じてフィールドを分離するために正確にどのように考え出しました。以下は、割引フィールドを2つに分割するコードです。必要に応じてフィールドを区切り、データをtempテーブルに分けて挿入し、同様のコードセットを使用して、カラット文字で囲まれた正確な量を引き出すことができます。上記の2つの答えのおかげで、ありがとう。私は両方の組み合わせを使って、私が必要とするものを正確に得ることができました。

CASE LEN(X.DISCOUNT)-LEN(REPLACE(X.DISCOUNT,',','')) 
    WHEN 1 THEN SUBSTRING(X.DISCOUNT,1,CHARINDEX(',',X.DISCOUNT)-1) 
    ELSE X.DISCOUNT  
END 'FIRST_DISCOUNT', 
CASE LEN(X.DISCOUNT)-LEN(REPLACE(X.DISCOUNT,',','')) 
    WHEN 1 THEN SUBSTRING(X.DISCOUNT,CHARINDEX(',',X.DISCOUNT)+1,LEN(X.DISCOUNT)-CHARINDEX(',',X.DISCOUNT)+1) 
    ELSE '' 
END 'SECOND_DISCOUNT' 
0

この代替ソリューションは、分割列のLEFTRIGHT関数を使用します。

select Store, Amount, 
Discount1 = CASE 
    WHEN CHARINDEX(',',Discount) > 1 THEN LEFT(Discount, CHARINDEX(',',Discount)-1) 
    ELSE Discount END, 
Discount2 = CASE 
    WHEN CHARINDEX(',',Discount) > 1 THEN RIGHT(Discount, LEN(Discount) - CHARINDEX(',',Discount)-1) 
    END 
from @Temp 
関連する問題