0

午後の皆さん、

私はOracleとSQLを初めて使用しますが、作成した以下のコードを使用したクエリがあります。現在、Oracle 10g を使用しています。ハードコーディングではなく、このコードを動的にするのを誰かが手伝ってくれるかどうか疑問に思っています。

私が持っているコードは、ユーザーのアクティビティを記録するテーブルを見ているだけです。次に、各ユーザー/PC のレコード数を基本的に数え、これをピボット スタイル テーブルに表示します。

それ自体はそれほど難しいクエリではありませんが、約 30 台ほどの PC を入力する必要があり、このハードコードされた方法は、このタスクを完了するための最善の方法ではありません。

インターネットで検索して、ホスト名または user_ID に基づいて使用できる動的ステートメントを調べましたが、データを単純にループしてからこの piviot スタイルのビューを生成するものを見つけることができませんでした。

私は「カーソル」を見てきましたが、私は長い間離れていると思います。

Ant ヘルプは、事前に非常に高く評価されています。

よろしくベティ

SELECT USER_ID,
    SUM(CASE WHEN host LIKE 'PC1' THEN 1 ELSE 0 END) AS PC1,
    SUM(CASE WHEN host LIKE 'PC2' THEN 1 ELSE 0 END) AS PC2,
    SUM(CASE WHEN host LIKE 'PC3' THEN 1 ELSE 0 END) AS PC3,
    SUM(CASE WHEN host IS NOT NULL THEN 1 ELSE 0 END) AS grand_total
FROM table_Name
GROUP BY USER_ID
4

1 に答える 1

1

オラクルの質問をするときは、リリースに注意することが重要です。あなたの場合-11gを使用している場合は、pivot関数を調べることができます。

10G(および11g)では、そのようなことを試すことができます

create or replace function get_pivot() 
return sys_refcursor
as
    stmt varchar2(32000);
    c sys_Refcursor;
    cursor c_values as 
        select distinct host from table_name;
begin
    stmt := 'select user_id , ';

    for x in c_values loop
        stmt := stmt || ' sum(case when host = '''||x.host||''' then 1 else 0 end) as ' ||host|| ',';
    end loop;

    stmt := stmt || ' count(host) as grand_total from table_name group by user_id';

    open c for stmt;
    return(c);
end get_pivot;

ピボットまたは動的SQLを使用しているかどうかにかかわらず、個別の値を照会する必要があります。

まだテストしていません。現時点ではオラクルを持っていません。

于 2013-07-26T13:38:13.430 に答える