使用带有子查询的最大查询将SQL / PL行转换为列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用带有子查询的最大查询将SQL / PL行转换为列相关的知识,希望对你有一定的参考价值。

我使用max函数从行转换为列,在子查询中使用它之前,它运行良好。

情况:[请参考图片为超链接]我总共有三个问题供客户回答,他们的回复将从数据库中提取出来。但是,对于第一个问题,客户可以选择1 - 10. 10指的是自由文本,并将存储在Question = 2的答案中。

但是,我想从客户中排除自由文本输入,并将提取排在列中。不得不说我将有三列:Response_1,Response_2和Response_3。当客户为Question = 1选择10时,Question = 3的答案将存储在Response_2中,而在Response_3中回答Question = 4。

我的尝试如下:

select customer_ID 

max( CASE WHEN Question = 1 THEN Answer END) Response_1,

max( CASE WHEN Question = 1 AND Answer != 10 THEN
   ( select 
       max( CASE WHEN Question = 2 THEN Answer END)
     from t_question_answer)
     ELSE
   ( select 
       max( CASE WHEN Question = 3 THEN Answer END)
     from t_question_answer)
     END) 
   ) Response_2  

from t_question_answer
group by customer_ID

对于为customer_2提取的数据,结果出错了,我认为在子查询中,它会再次查找整个数据中的最大值,而不是指定同一个客户。

答案

在条件聚合中需要更多的条件逻辑:

select customer_ID 
       max(CASE WHEN Question = 1 THEN Answer END) Response_1,
       (case when max(case when question = 1 and answer = 10 then 1 else 0 end) > 0
             then max( CASE WHEN Question = 3 THEN Answer END)
             else max( CASE WHEN Question = 2 THEN Answer END)
           end) as Response_2,
       (case when max(case when question = 1 and answer = 10 then 1 else 0 end) > 0
             then max( CASE WHEN Question = 4 THEN Answer END)
             else max( CASE WHEN Question = 3 THEN Answer END)
           end) as Response_3
from t_question_answer
group by customer_ID

以上是关于使用带有子查询的最大查询将SQL / PL行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 查询转换为 PL/SQL 可以提高 Oracle 12c 中的性能吗? [关闭]

sql子查询到mongodb

C# 将带有 Case 语句的 SQL 查询转换为 LINQ

带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询

创建带有 2 个游标、一个参数并从表中给出结果的 PL/SQL 脚本?

如何将带有内连接语句的 Sql 查询转换为带有 Where 语句的 sql 查询(语句中没有内连接)