0

我需要得到这样的查询结果:

        |Person1                  |Person2                  |Person3                  |...
        ------------------------------------------------------------------------------------
Date1   |function(Person1Id,Date1)|function(Person2Id,Date1)|function(Person3Id,Date1)|...         
Date2   |function(Person1Id,Date2)|function(Person2Id,Date2)|function(Person3Id,Date2)|...
Date3   |function(Person1Id,Date3)|function(Person2Id,Date3)|function(Person3Id,Date3)|...
.
.
.

日期来自用户,PersonIds 来自表。我需要做的只是发送函数的 id 和日期并得到它的结果。由于我正在研究 oracle v10.2.0,因此旋转不起作用并且编写案例......当每个人的陈述都不起作用时,因为我要获取的表中有很多人。

任何帮助表示赞赏。

4

1 回答 1

1

您可以在数据库版本中使用条件聚合,10g例如

SELECT myDate,
       MAX(CASE WHEN PersonId=1 THEN myfunc(PersonId,myDate) END) AS Person1,
       MAX(CASE WHEN PersonId=2 THEN myfunc(PersonId,myDate) END) AS Person2,
       MAX(CASE WHEN PersonId=3 THEN myfunc(PersonId,myDate) END) AS Person3
  FROM t 
 GROUP BY myDate

更新:然而,存在一个选项,即使在 DB中也10g可以通过使用来进行动态旋转SYS_REFCURSOR,例如。使用 PL/SQL 而不是仅使用 SQL,如果您使用的是 SQL Developer,则在命令行上显示结果集。创建存储函数

CREATE OR REPLACE FUNCTION get_person_rs RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767);
  v_str       VARCHAR2(32767);
BEGIN
  WITH tt AS
  ( 
   SELECT PersonId, 
          ROW_NUMBER() OVER (ORDER BY PersonId) AS rn  
     FROM t 
    GROUP BY PersonId 
  )
  SELECT TO_CHAR(RTRIM(XMLAGG(XMLELEMENT(e, 
           'MAX(CASE WHEN PersonId = '||PersonId||
                   ' THEN myfunc(PersonId,myDate) 
                      END) AS Person'||rn         
           , ',')).EXTRACT('//text()').GETCLOBVAL(), ','))
    INTO v_str         
    FROM tt;  

  v_sql :=
  'SELECT myDate, '|| v_str ||'
     FROM t
    GROUP BY myDate';

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;

其中,ROW_NUMBER()使用了 中可用的解析函数,10gLISTAGG()中还没有字符串聚合函数10g。所以XMLAGG改为使用。函数中生成的这个 SQL 字符串也与上面的完全相同,例如。在条件聚合逻辑中。

然后运行以下代码:

VAR rc REFCURSOR
EXEC :rc := get_person_rs;
PRINT rc

从 SQL Developer 的命令行中查看由当前现有数据动态生成的预期结果集。

于 2020-03-26T09:30:52.903 回答