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

你有两个问题。首先是您的查询没有提供您在 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' 

警告:您的别名在翻译中被破坏了,所以这可能不起作用,但基本原则是您需要 RESULTS 表的三个实例,一个用于您从 OBJECTNAMES 表中调用的每个不同属性。

第二个问题是您的布局与结果集不匹配。这是另一个经典问题,这一次与使用错误的工作工具有关。电子表格并不是真正的 GUI 演示工具。Excel 的强大之处在于处理列矩阵和行矩阵。所以通常它非常适合使用数据库,因为查询返回列和行。

您处于泡菜状态,因为您想一次显示不同的某些列,并多次显示某些列。有许多不同的方法来处理这个问题。

  1. 使用内联游标表达式返回锯齿状结果集。虽然坦率地说我不知道​​ ODBC 是否支持这一点以及 Excel 是否能够呈现它。
  2. 使用两种查询,一种用于返回“主数据”——PersonName、Date——另一种用于检索详细信息——其他所有信息。
  3. 使用您现有的查询将完整的结果集检索到一个工作表中,但向用户提供一个不同的工作表,该工作表使用引用来实现您需要的布局。
  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 操作系统中达到预期的效果

采用 Bob 的答案并获得您想要的结果

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