Выберите одно значение столбца для других столбцов в зависимости от условия

У меня есть таблица, подобная приведенной ниже структуре, мне нужно написать запрос для получения результата, например, полученный месяц удержания comnet для всех оставшихся месяцев из таблицы на основе условия, если фактическое значение больше или равно целевому, затем выберите этот конкретный месяц Значение comments и для оставшихся месяцев. Моя структура таблицы

Выберите одно значение столбца для других столбцов в зависимости от условия

Я ожидаю результата, подобного приведенной ниже структуре.

Выберите одно значение столбца для других столбцов в зависимости от условия

Здесь в июне фактическое значение равно 100, и после того, как пользователь ничего не будет вводить («Фактическое» или «комментарии»), будет добавлен комментарий «Закрыто», поскольку фактическое значение соответствует целевому. поэтому мне нужно отображать комментарий "Закрыто" во все оставшиеся месяцы (июль-декабрь)

Если значение Target и Actual равно NULL, нужно ли нам учитывать эту строку? Кроме того, ожидаемый результат похож на структуру вашей таблицы, за исключением столбца комментариев. Ожидается ли это?

Sukhpal Singh 09.09.2018 06:41

@SukhpalSingh нет необходимости учитывать нулевые значения. Как только целевое значение соответствует фактическому выбору, этот месяц комментарии к оставшимся месяцам. структура таблицы тоже такая же

Jzl 09.09.2018 06:49

Ваш ожидаемый результат неясен, добавьте ясности

Jaydip Rakholiya 09.09.2018 07:04

ожидаемый результат - как только фактическое достижение цели, тогда возьмите комментарии из этого целевого месяца и отобразите их для всего оставшегося месяца

Jzl 09.09.2018 07:08

@Jzl Вам нужно обновить существующую таблицу или просто выбрать запрос?

Sukhpal Singh 09.09.2018 07:55

@SukhpalSingh Выбрать quey

Jzl 09.09.2018 08:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
6
967
6

Ответы 6

Ваш ожидаемый результат неясен. Пожалуйста, внесите ясность. Как насчет этого? -

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 в запросе выбора

Jzl 09.09.2018 08:36

Что означает последнее введенное значение? Кроме того, решает ли мой ответ ваш исходный вопрос?

Sukhpal Singh 09.09.2018 08:44

Просто мне нужно отобразить комментарий предыдущего месяца ко всем столбцам связи следующего месяца. ваш запрос еще не решен

Jzl 09.09.2018 08:50

Это не тот вопрос, который вы задали.

Sukhpal Singh 09.09.2018 08:53

Я изменил свой вопрос

Jzl 09.09.2018 09:10

Из объяснения кажется, что вам не нужно ничего, кроме этого:

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.

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

Полученные результаты:

| 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;

Другие вопросы по теме