根据条件为其他列选择一个列值

时间:2018-09-09 04:31:09

标签: sql oracle oracle11g

我有一个如以下结构所示的表,我需要编写一个查询以根据条件(如果实际值大于或等于目标)从表中获取所有剩余月份的结果,如获得的月份comnet保留值。该特定月份comments的剩余月份值。我的表格结构是

Table

我期望结果如下所示。

Result

6月份的实际值为100,并且由于实际达到目标,用户将不输入任何内容(“实际”或“注释”),并注释“已关闭”。所以我需要在剩余的所有月份(7月至12月)中显示“关闭”的注释

6 个答案:

答案 0 :(得分:0)

您的预期输出不清楚,请增加清晰度。 这个怎么样? -

SELECT *
  FROM YOUR_TABLE
 WHERE MONTHS_ID IN (SELECT MONTHS_ID FROM YOUR_TABLE WHERE ACTUAL_VALUE >= TARGET)

是否要按Months_ID汇总评论?

SELECT MONTHS_ID,
       LISTAGG(COMMENTS, ',') WITHIN GROUP(ORDER BY COMMENTS) AS COMMENTS
  FROM YOUR_TABLE
 WHERE MONTHS_ID IN (SELECT MONTHS_ID  FROM YOUR_TABLE WHERE ACTUAL_VALUE >= TARGET)
 GROUP BY MONTHS_ID

答案 1 :(得分:0)

您可以根据自己的过滤条件在哪里使用

    select a.comment 
    from your_table_with_commen a 
    where a.comment is not null
    and a.target is not null 
    and a.target <= a.actual

答案 2 :(得分:0)

您的预期输出不是很清楚。但是,如果我正确理解它,则可以使用以下查询来达到所需的结果(可能效果不佳):

with commentValue as (
select month_id, comments from your_table where actual_value = ( select max(target) 
from your_table) 
)
select yt.target,yt.month_id,
case when yt.month_id >= cv.month_id then cv.comments else yt.comments end as 
comments,
yt.actual_value
from your_table yt
join commentValue cv on 1 = 1

答案 3 :(得分:0)

从解释看来,您仅需要这些:

Select month, nvl(comment,'Closed') as comment, target, actual
  From tableDemands;

答案 4 :(得分:0)

  

我需要写一个查询以根据条件(如果实际值大于或等于目标)从表中获取所有剩余月份的结果,例如获得的月份comnet保留值,然后也选择剩余月份的特定月份注释值

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name ( month, "COMMENT", target, actual ) AS
  SELECT  1, 'initiated',          NULL,    5 FROM DUAL UNION ALL
  SELECT  2, 'feb',                NULL,    6 FROM DUAL UNION ALL
  SELECT  3, 'Mar- On going',      NULL,   10 FROM DUAL UNION ALL
  SELECT  4, 'Apr- work On going', NULL,   20 FROM DUAL UNION ALL
  SELECT  5, 'May- Ongoing',       NULL,   50 FROM DUAL UNION ALL
  SELECT  6, 'closed',             NULL,  100 FROM DUAL UNION ALL
  SELECT  7, NULL,                 NULL, NULL FROM DUAL UNION ALL
  SELECT  8, NULL,                 NULL, NULL FROM DUAL UNION ALL
  SELECT  9, NULL,                  100, NULL FROM DUAL UNION ALL
  SELECT 10, NULL,                 NULL, NULL FROM DUAL UNION ALL
  SELECT 11, NULL,                 NULL, NULL FROM DUAL UNION ALL
  SELECT 12, NULL,                 NULL, NULL FROM DUAL;

查询1

SELECT month,
       "COMMENT",
       max_target As target,
       actual
FROM   (
  SELECT t.*,
         MAX( target ) OVER () AS max_target
  FROM   table_name t
)
WHERE actual >= max_target

Results

| MONTH | COMMENT | TARGET | ACTUAL |
|-------|---------|--------|--------|
|     6 |  closed |    100 |    100 |

答案 5 :(得分:0)

似乎您想用最后一个非空注释替换空注释。为此,请使用LAST_VALUE

select
  month,
  last_value(comment ignore nulls) over (order by month) as comment,
  target,
  actual
from mytable
order by month;