2012-04-25 6 views
1

私はOracle XE11gとExcel 2007を使用しています。複数のテーブルからフィールドを選択するビューをSQL Developerで作成しました。 ODBCを使用してExcelにこのビューをインポートさせることを目的としています。Oracle - Excelビュー

personname - testname - time  - objectname - result - date 
Edward  - RunningTest - 15:22:01 - Speed (km/h) - 12  - 24-04-2012 
Edward  - RunningTest - 15:22:01 - Heart Rate - 98  - 24-04-2012 
Edward  - RunningTest - 15:22:01 - Power  - 50  - 24-04-2012 
Edward  - RunningTest - 15:22:02 - Speed (km/h) - 13  - 24-04-2012 
Edward  - RunningTest - 15:22:02 - Heart Rate - 99  - 24-04-2012 
Edward  - RunningTest - 15:22:02 - Power  - 12  - 24-04-2012 
Edward  - RunningTest - 15:22:03 - Speed (km/h) - 12  - 24-04-2012 
Edward  - RunningTest - 15:22:03 - Heart Rate - 100 - 24-04-2012 
Edward  - RunningTest - 15:22:03 - Power  - 12  - 24-04-2012 

そして、これがのクエリです:問題は、それは私がExcelに私の作成したビューを使用している場合、私はこのような何かを得るエクセル

にビューはデータ私が望むように与えていないことです私が使用しているビュー:

クエリが英語のフィールド名に変換されるので、多少の誤差が生じる可能性があります。

私はExcelで表されるデータを持っているしたいのですが方法が、このようなものです:

Personname 
Edward 

Date 
24-04-2012 

    Time  - Speed (km/h) - Heart Rate - Power 
    15:22:01 - 12   - 98   - 50 
    15:22:02 - 13   - 99   - 52 
    15:22:03 - 12   - 100  - 51 
    etc------------ 

は、上記のようなデータを示しているように、ビューを構築する方法はありますか? 何か助けていただければ幸いです。

+0

説明:何が間違っていますか、ビューによって返されたデータまたはExcelによってインポートされたデータですか? –

+0

IMHO、このような書式設定はExcelで行う必要があります –

+0

ビューから返されるデータが間違っています。私がExcelでフォーマットする際に問題となるのは、動的でなければならないということです。私はちょうどすぐにExcelにインポートされた適切なデータをしたい。これらのデータを使用して、別のタブページでグラフや統計を作成することができます。 – Edwardo

答えて

1

あなたには2つの問題があります。 1つは、クエリがExcelで必要なデータを提供していないことです。これは、適切なスキーマの代わりにキーと値のペアを使用することから生じる古典的な問題です。ここで

は、一つの可能​​な解決策である:

select psn.naam personname 
     , tst.name testname 
     , tms.seconds time 
     , rst1.result speed 
     , rst2.result heartrate 
     , rst3.result power 
     , dtm.days date 
from persons psn 
    , results trt1 
    , results trt2 
    , results trt3 
    , times tms 
    , tests tst 
    , objects obj 
    , dates dts 
where psn.id=trt.persons_id 
and obj.tests_id=tst.id 
and trt1.date_id=dts.id 
and trt2.date_id=dts.id 
and trt3.date_id=dts.id 
and trt1.times_id=tms.id 
and trt2.times_id=tms.id 
and trt3.times_id=tms.id 
and ((obj.name = 'Speed (km/h)' and obj.id=trt1.objects_id) 
     or (obj.name = 'Heart Rate' and obj.id=trt2.objects_id) 
     or (obj.name = 'Power' and obj.id=trt3.objects_id) 
    ) 
and tst.name='RunningTest' 

警告:あなたのエイリアシングはので、これはうまく動作しない場合があり、翻訳にマングルされたが、基本的な原理は、あなたが結果表の3つのインスタンス、各disctinctに1つずつ必要ですあなたがOBJECTNAMESテーブルから呼び出す属性。

2番目の問題は、レイアウトが結果セットと一致しないことです。これは別の古典的な問題で、今度は間違ったツールをジョブに使用することに関連しています。スプレッドシートは実際にはGUIプレゼンテーションツールではありません。 Excelの大きな強みは、列と行の行列で動作していることです。したがって、通常はデータベースでの作業に適しています。なぜなら、クエリは列と行を返すためです。

いくつかの異なる列を一度表示し、いくつかの列を複数回表示する必要があるため、ピクルスにいます。これを扱うにはいくつかの異なる方法があります。

  1. ギザギザの結果セットを返すには、an inline cursor expressionを使用します。率直に言って、私はODBCがこれをサポートしているかどうか、そしてExcelがそれをレンダリングできるかどうかはわかりません。
  2. 2つのクエリを使用して、1つは "マスタデータ" - PersonName、Date - を返し、もう1つは詳細を取得します。
  3. 既存のクエリを使用して1つのワークシートに完全な結果セットを取得しますが、参照を使用して必要なレイアウトを実現する異種ワークシートをユーザーに提示します。
  4. 適切なGUI開発ツールを使用して、クライアントアプリケーションを構築します。市場には数多くのものがあります。エイペックスは良い選択かもしれません:find out more
+0

私はちょうど完全な答えではありませんが、ほぼ同じSQLを書いて20分を費やしました。より速く働かなければならない! :) –

1

次PIVOTクエリはあなたが望むものに近い取得する必要がありますが、一緒にプレイするためにデータのない私は100%わからない - しかし、あなたはから作業することが出発点を提供する必要があります:

SELECT * FROM 
    (SELECT * FROM 
    (SELECT psn.NAAM PERSONNAME, 
      tst.NAME TESTNAME, 
      tms.SECONDS TIME, 
      obj.NAME OBJECTNAME, 
      rst.RESULT RESULT, 
      dts.DAYS DATE 
     FROM PERSONS psn, 
      RESULTS rst, 
      TIMES tms, 
      TESTS tst, 
      OBJECTS obj, 
      DATES dts 
     WHERE psn.ID = rst.PERSONS_ID AND 
      obj.ID = rst.OBJECTS_ID AND 
      obj.TESTS_ID = tst.ID AND 
      trt.DATE_ID = dts.ID AND 
      rst.TIMES_ID = tms.ID AND 
      tst.NAME = 'RunningTest') t 
    PIVOT(SUM(RESULT) 
     FOR OBJECTNAME IN ('Speed (km/h)', 'Heart Rate', 'Power'))); 

共有して楽しんでください。

0
あなたは親切にテストし、既存の答えを使用して

Select name || chr(10) || chr(13) || date || chr(10) || chr(13)|| other select columns in your view 

ご希望の結果とボブの答えを採用のWindows OS

で所望の結果を達成するために、行の最後を挿入するには、以下を使用することができます

SELECT PERSONNAME || chr(10) || chr(13) as PERSONNAME, 
     DATE || chr(10) || chr(13) as DATE, 
     chr(10) || chr(13) ||TESTNAME, 
     OBJECTNAME, 
     RESULT 
    FROM (SELECT * 
     FROM (SELECT psn.NAAM PERSONNAME, 
       tst.NAME TESTNAME, 
       tms.SECONDS TIME, 
       obj.NAME OBJECTNAME, 
       rst.RESULT RESULT, 
       dts.DAYS DATE 
      FROM PERSONS psn, 
       RESULTS rst, 
       TIMES tms, 
       TESTS tst, 
       OBJECTS obj, 
       DATES dts 
     WHERE psn.ID = rst.PERSONS_ID 
      AND obj.ID = rst.OBJECTS_ID 
      AND obj.TESTS_ID = tst.ID 
      AND trt.DATE_ID = dts.ID 
      AND rst.TIMES_ID = tms.ID 
      AND tst.NAME = 'RunningTest') t PIVOT(SUM(RESULT) 
      FOR OBJECTNAME IN ('Speed (km/h)', 'Heart Rate', 'Power'))); 
関連する問題