#sql
#sql
Вопрос:
У меня есть несколько таблиц, которые выглядят как
SQL> select * from stipend
2 order by subjectid, stipdate;
SUBJECTID STIPDATE AMOUNT
---------- ----------- ----------
10011 31-oct-2021 800
10111 31-jul-2019 2000
10111 31-jul-2021 1500
20022 31-jul-2020 1200
30033 29-feb-2020 1400
40044. 31-jul-2020 1200
40044 31-jul-2021 2000
50055 31-jul-2021 2000
50055 30-sep-2021 1000
SQL> select * from subject
2 order by subjectid;
SUBJECTID LNAME FNAME PROJID
---------- ------------ --------------------
10011 Indy Eva XYZ01
10111 Isner Monica XYZ04
11011 Dupont Marty XYZ05
20022 Jordan Sam XYZ01
30033 Jordan Mary XYZ01
40044 Belmont Renee XYZ02
50055 Pissaro Becky XYZ02
60066 Nadal Becky XYZ03
70077 Bardot Brigitte XYZ03
80088 null Eva XYZ03
90099 Garnet Larry XYZ04
И я хочу обновить стипендии, которые есть в проектах XYZ01 и XYZ02, на 40%, используя CASE WHEN construct. Очевидно, что две таблицы соединены с помощью stipend.subjectid = subject.subjectid и я бы использовал subject.projectid для определения этого, но как мне это сделать с CASE WHEN ?
Комментарии:
1. Являются ли XYZ01 и XYZ02 единственными двумя идентификаторами проекта, которые вы заинтересованы в обновлении?
2. Если вы найдете приведенные ниже ответы полезными, отметьте их.
3. Я буду, я просто не нашел тот, который работает.
4. Какую СУБД вы используете?
Ответ №1:
Вы пробовали это?
SELECT
SUBJECTID
,PROJID
,CASE WHEN ProjectID in ('XYZ01','XYZ02') THEN AMOUNT * 1.4 ELSE AMOUNT END as AMOUNT
FROM subject sb
LEFT JOIN stipend st ON st.SUBJECTID = sb.SUBJECTID
Комментарии:
1. Это не совсем сработало…
Ответ №2:
Вы можете попробовать это. Здесь я использовал таблицу стипендий в качестве LEFT
таблицы, вы можете изменить это:
SELECT
st.SUBJECTID, sb.PROJID, Amount,
CASE WHEN ProjID in ('XYZ01','XYZ02') THEN AMOUNT * 1.4
ELSE AMOUNT
END as Updated_AMOUNT
FROM stipend st
LEFT JOIN subject sb
ON st.SUBJECTID = sb.SUBJECTID
Примечание: использование subject в качестве левой таблицы может привести к другому уровню. Попробуйте их в демонстрационной ссылке ниже.
Ответ №3:
Пожалуйста, проверьте это. У меня нет данных, поэтому я их не тестировал.
MySQL:
UPDATE
stipend st
join subject sub on st.SUBJECTID = sub.SUBJECTID
SET
AMOUNT = CASE WHEN
sub.ProjectID in ('XYZ01', 'XYZ02')
THEN AMOUNT * 1.4
ELSE AMOUNT
END
Oracle
Я думаю, SQL Plus имеет аналогичный синтаксис Oracle DB, вы можете попробовать это
Note: This syntax is converted online by https://www.sqlines.com/online . Pls check it
UPDATE
stipend st
join subject sub on st.SUBJECTID = sub.SUBJECTID
AMOUNT := CASE WHEN
sub.ProjectID in ('XYZ01', 'XYZ02')
THEN AMOUNT * 1.4
ELSE AMOUNT
END
Комментарии:
1. Это не совсем сработало. в нем говорилось, что мне не хватает ключевого слова SET и помечена строка темы соединения.
2. какой sql вы используете?? Я написал эту команду в соответствии с MySQL. И эта команда предназначена для обновления количества учащихся с учащимися с заданным проектом, если. Вы хотите обновить таблицу?
3. Я использую sqlplus, я думаю
4. присоединиться к теме на стипендию.subjectid = subject.subjectid * ОШИБКА в строке 2: ORA-00971: отсутствует ключевое слово SET
Ответ №4:
Лучше использовать обычное соединение, так как левое соединение приведет к появлению повторяющихся значений в вашем результате.
UPDATE STPIEND SET AMOUNT = CASE WHEN T1.AMOUNT IN ('XYZ01','XYZ02') THEN T1.AMOUNT * 1.4
ELSE T1.AMOUNT
END AS UPDATED_AMOUNT
FROM STIPEND T1 JOIN SUBJECT T2 ON T1.SUBJETID = T2.SUBJETID
Комментарии:
1. вы пробовали это? Как выглядит ваш o / p
2. Специфичный для продукта ответ на вопрос, в котором не указана СУБД. По крайней мере, скажите нам, для какой СУБД это предназначено.