1

Oracle XE11g と Excel 2007 を使用しています。複数のテーブルからフィールドを選択するビューを SQL Developer で作成しました。その意図は、Excel が ODBC を使用してこのビューをインポートできるようにすることです。問題は、ビューが Excel で必要な方法でデータを提供していないことです

作成したビューを 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

そして、これは私が使用するビューのクエリです:

select psn.naam personname
, tst.name testname
, tms.seconds time
, obj.name objectname
, trt.result result
, dtm.days date
from persons psn
, results rst
, times tms
, tests tst
, objects obj
, dates dts
where psn.id=trt.persons_id
and obj.id=trt.objects_id
and obj.tests_id=tst.id
and trt.date_id=dts.id
and rst.times_id=tms.id
and tst.name='RunningTest'

クエリは英語のフィールド名に翻訳されているため、エラーが含まれている可能性があることに注意してください。

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------------

上記のようなデータを表示するようにビューを作成する方法はありますか? どんな助けでも大歓迎です。

4

3 に答える 3

1

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

考えられる解決策の 1 つを次に示します。

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' 

警告: あなたのエイリアシングは変換中に壊れてしまったので、うまくいかないかもしれませんが、基本的な原則として、RESULTS テーブルの 3 つのインスタンス (OBJECTNAMES テーブルから呼び出す個別の属性ごとに 1 つ) が必要です。

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

異なるいくつかの列を一度表示し、いくつかの列を複数回表示したいので、あなたは窮地に陥っています。これにはさまざまな方法があります。

  1. ギザギザの結果セットを返すには、インライン カーソル式を使用します。率直に言って、ODBC がこれをサポートしているかどうか、Excel がレンダリングできるかどうかはわかりません。
  2. 2 つのクエリを使用します。1 つは "マスター データ" (PersonName、Date) を返し、もう 1 つは詳細 (その他すべて) を取得します。
  3. 既存のクエリを使用して完全な結果セットを 1 つのワークシートに取得しますが、参照を使用して必要なレイアウトを実現する別のワークシートをユーザーに提示します。
  4. クライアント アプリケーションを構築するには、適切な GUI 開発ツールを使用してください。市場にはいくらでもあります。Apex が良い選択かもしれません:詳しくはこちら をご覧ください
于 2012-04-25T13:44:43.803 に答える
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')));

共有してお楽しみください。

于 2012-04-25T14:33:37.003 に答える
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')));
于 2012-04-25T17:52:20.450 に答える