我有一个如以下结构所示的表,我需要编写一个查询以根据条件(如果实际值大于或等于目标)从表中获取所有剩余月份的结果,如获得的月份comnet保留值。该特定月份comments
的剩余月份值。我的表格结构是
我期望结果如下所示。
6月份的实际值为100,并且由于实际达到目标,用户将不输入任何内容(“实际”或“注释”),并注释“已关闭”。所以我需要在剩余的所有月份(7月至12月)中显示“关闭”的注释
答案 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保留值,然后也选择剩余月份的特定月份注释值
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;