У меня есть таблица, подобная приведенной ниже структуре, мне нужно написать запрос для получения результата, например, полученный месяц удержания comnet для всех оставшихся месяцев из таблицы на основе условия, если фактическое значение больше или равно целевому, затем выберите этот конкретный месяц Значение comments
и для оставшихся месяцев. Моя структура таблицы
Я ожидаю результата, подобного приведенной ниже структуре.
Здесь в июне фактическое значение равно 100, и после того, как пользователь ничего не будет вводить («Фактическое» или «комментарии»), будет добавлен комментарий «Закрыто», поскольку фактическое значение соответствует целевому. поэтому мне нужно отображать комментарий "Закрыто" во все оставшиеся месяцы (июль-декабрь)
@SukhpalSingh нет необходимости учитывать нулевые значения. Как только целевое значение соответствует фактическому выбору, этот месяц комментарии к оставшимся месяцам. структура таблицы тоже такая же
Ваш ожидаемый результат неясен, добавьте ясности
ожидаемый результат - как только фактическое достижение цели, тогда возьмите комментарии из этого целевого месяца и отобразите их для всего оставшегося месяца
@Jzl Вам нужно обновить существующую таблицу или просто выбрать запрос?
@SukhpalSingh Выбрать quey
Ваш ожидаемый результат неясен. Пожалуйста, внесите ясность. Как насчет этого? -
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
вы можете использовать where на основе вашего условия фильтрации
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
Ваш ожидаемый результат не очень ясен. Но если я понял это правильно, то вы можете добиться желаемого результата, используя запрос ниже (может быть не самым эффективным):
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
через 6 месяцев пользователь вводит комментарий. Если я запрашиваю запрос в декабре, мне нужно получить результат, указанный выше. после 6-го месяца в столбце комментариев нет значений, поэтому по умолчанию последнее введенное значение должно быть заменено на null в запросе выбора
Что означает последнее введенное значение? Кроме того, решает ли мой ответ ваш исходный вопрос?
Просто мне нужно отобразить комментарий предыдущего месяца ко всем столбцам связи следующего месяца. ваш запрос еще не решен
Это не тот вопрос, который вы задали.
Я изменил свой вопрос
Из объяснения кажется, что вам не нужно ничего, кроме этого:
Select month, nvl(comment,'Closed') as comment, target, actual
From tableDemands;
I need to write a query to fetch result like achived month comnet retaine for all remaining months from the table based on a condition if the actual value is greater than or equal to target then select that particular month comments value for remaining months too.
Настройка схемы 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
| MONTH | COMMENT | TARGET | ACTUAL |
|-------|---------|--------|--------|
| 6 | closed | 100 | 100 |
Похоже, вы хотите заменить пустой комментарий последним ненулевым комментарием. Используйте для этого LAST_VALUE
:
select
month,
last_value(comment ignore nulls) over (order by month) as comment,
target,
actual
from mytable
order by month;
Если значение
Target
иActual
равноNULL
, нужно ли нам учитывать эту строку? Кроме того, ожидаемый результат похож на структуру вашей таблицы, за исключением столбца комментариев. Ожидается ли это?