2017-11-08 15 views
0

私の会社は、工場ID、部門ID、ログ日付、ログ時間、カウンタ値のログ分を含む1つのテーブルにLog_Infoを格納します。この場合、Oracle Database 10gリリース10.2でPL/SQLを使用すると、[Log hour + Log min]を列に変換する方法を教えてください。PL/SQLでログ行を複数の列に変換する

ありがとうございました。

Our Log_Info

+0

[画像を投稿しないでください](https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so-when -asking-a-question/285557#285557)。生データ、期待される結果、現在の最良の試みをフォーマットされたテキストとして表示し、問題の原因を説明してください。これにはPL/SQLが本当に必要ですか? –

+0

あなたの答えをありがとう。私は結果を生成するためにC#を使うことができますが、大量のデータを1〜2年でforeachを使用してチェックしてから1つずつ充填するのは非常に遅いです。しかし、SQLでの直接選択は非常に高速ですので、PL/SQLが良い選択であることを願っています。再度、感謝します。 –

答えて

0

私がネイティブにこの種のものを行うための非常に簡単な方法である、PIVOTを使用するためにあなたを言うだろうが、残念ながら私はそれが11グラムで導入されたと考えています。私が知る限り、2つの選択肢があります。ネイティブSQLを使用する場合は、ハードコードされたcaseステートメントを使用する必要があります。そうでない場合は、このソリューションは、これはあなたの代わりに、PUT_LINEのあなたは、あなたが選択したものは何でも、ループ内でか、結果セットに実行することができ、動的クエリを(与える

declare v_str varchar2(2000); 
begin 
v_str:='select factoryid,deptid,logdate'; 
for i in (select distinct 'H'||loghour||'_'||logmin a from test_table order by a) loop 
    v_str:=v_str||',max(case ''H''||loghour||''_''||logmin when '''||i.a||''' then counter end) as "'||i.a||'"'; 
end loop; 
    v_str:=v_str||' from test_table group by factoryid,deptid,logdate order by factoryid'; 
    DBMS_OUTPUT.PUT_LINE(v_str); 
end; 

..あなたに有用である可能性がある私がここにあります)。現在提供しているデータに基づくこのブロックの結果は、次のとおりです。

select factoryid,deptid,logdate, 
max(case 'H'||loghour||'_'||logmin when 'H0_0' then counter end) as "H0_0", 
max(case 'H'||loghour||'_'||logmin when 'H0_30' then counter end) as "H0_30", 
max(case 'H'||loghour||'_'||logmin when 'H1_0' then counter end) as "H1_0", 
max(case 'H'||loghour||'_'||logmin when 'H1_30' then counter end) as "H1_30", 
max(case 'H'||loghour||'_'||logmin when 'H2_0' then counter end) as "H2_0" 
from test_table 
group by factoryid,deptid,logdate order by factoryid 

あなたが探しているものを正確に表示します。

EDIT:case文のすべてをグループ化しないようにMAXが組み込まれています。これは、ファクトリのid/deptid/logdateごとに1つのカウンタ値が1つだけ存在することを前提としています。

ネイティブルートに移動し、loghourとlogminの定義済みのリスト(100%ではありませんが、H0_0からH23_30に行くように見えます)を使用したい場合は、PL/SQLブロックは上記のように吐き出され、すべてのログとログが説明されるまで、case文を作成し続けます。この場合、loghour/minにスパンが定義されている場合は、カーソル・キャッシングなどのパフォーマンス上の利点があるため、動的SQLよりもネイティブSQLを使用する必要があります。

+0

ありがとうございます。それはうまく動作します。 –

関連する問題