当前位置: 首页 > 知识库问答 >
问题:

带有变量列的SQL透视

龚玄天
2023-03-14

我有两个表:Person(person_id,name)和另一个表Contacts(person_id,phone_type,phone_no)。

Person
-----------------
person_id    name
-----------------
P1           Abc 
P2           Xyz
Contacts
--------------------------------
person_id   phone_type  phone_no
--------------------------------
P1          phone1      12345
P1          phone2      23455
P2          phone1      67897
P2          phone3      89786
v_pc
person_id  name phone1 phone2 phone3
-------------------------------------
P1         Abc  12345  23455  
P2         Xyz  67897         89786

例如,contacts表的行被透视以形成视图的列(列的数量将根据'phone_types'列的不同值而变化)。

有什么方法可以透视contacts表,但使用动态pivot-in-sublic,类似

SELECT *
 FROM (
    SELECT
        person_idd,
        phone_type,
        phone_no
    FROM contacts
 ) PIVOT (MAX(phone_no) FOR phone_type IN ('phone1','phone2','phone3'))

共有1个答案

夏朝
2023-03-14

您可以使用动态SQL(假设您有一个类型为SYS_REFCURSOR的绑定变量v_cur):

declare
  v_sql varchar2(32000);
  v_phonetypes varchar2(32000);
begin
  -- base SQL statement
  v_sql := 'SELECT *
    FROM (
      SELECT
        person_id,
        phone_type,
        phone_no
      FROM contacts
    ) PIVOT (MAX(phone_no) FOR phone_type IN (';

  -- comma-separated list of phone types
  select 
    listagg('''' || phone_type || '''', ',') within group (order by phone_type) 
  into v_phonetypes 
  from (select distinct phone_type from contacts);

  v_sql := v_sql || v_phonetypes || '))';
  dbms_output.put_line(v_sql);
  -- execute query 
  open :v_cur for v_sql;
end;

LISTAGG()需要11gr2,但是既然您使用的是PIVOT,我想您还是要使用它。

 类似资料:
  • 问题内容: 问题是阿拉伯文字未打印-请谁能解决我的问题? 问题答案: 删除并将编码更改为,这应该使您的字符

  • 问题内容: 我正在尝试使用NSLocalizedString本地化我的应用程序。当我导入XLIFF文件时,大多数工作都像一个超级按钮,但是有些却没有,有些字符串没有本地化。我注意到问题出在NSLocalizedString中,其中包含一些变量,例如: 要么 也许这不是这类东西的正确语法。有人可以向我解释如何迅速做到这一点?非常感谢你。 问题答案: 您可以在中使用format参数,因此您的示例如下所

  • 我正在做一个简单的天气应用程序,我有一个问题,通过AsyncTask读取变量。我是andorid编程的初学者,所以我要求理解。因此,我想将变量“latitude”和“longitude”从place picker中选择到asynctask.execute(“latitude”,“longitude”)中,并刷新屏幕以显示新位置的天气。但我注意到,当我在代码中不是通过变量(例如asynctask.e

  • 问题内容: MS SQL Server 2012 我有一个名为 indexrows* 的表 * 我想将这些结果转换为如下形式。 我尝试了以下查询,但未成功。我得到这个错误 消息156,级别15,状态1,第10行关键字“ for”附近的语法错误。 任何帮助表示赞赏。 问题答案: 您的查询有些错误。 首先,您在PIVOT上缺少聚合函数。您需要一个汇总。 其次,您需要用方括号而不是单引号将。等括起来。

  • 问题内容: 您将如何用PHP编写一个准备好的MySQL语句,每次使用不同数量的参数?这样的查询的示例是: 该条款将有不同数量的s各自运行它时。 我心中有两种可能的解决方案,但想看看是否有更好的方法。 可能的解决方案1 使该语句接受100个变量,并用保证不在表中的伪值填充其余变量;多次调用100多个值。 可能的解决方案2 请勿使用准备好的语句;严格构建并运行查询以检查可能的注入攻击。 问题答案: 我

  • 问题内容: 我有以下代码在控制器中设置变量: 在百里香视图中,我想构造一个带有动作网址的表单: 任何想法如何实现这一目标?我没看过百里香的文档。 问题答案: 正如user482745在注释(现在已删除)中建议的那样,我之前建议的字符串连接 在某些网络环境下会失败。 Thymeleaf用来解析表达式。在内部,使用。它的javadoc状态 为了进行可靠的会话跟踪,应通过此方法运行servlet发出的所