#sql #oracle
#sql #Oracle
Вопрос:
Элон Рив Маск FRS — предприниматель и бизнес-магнат. Он является основателем, генеральным директором и главным инженером SpaceX; инвестором на ранней стадии, генеральным директором и разработчиком продукта Tesla, Inc.; основатель The Boring Company; и соучредитель Neuralink и OpenAI.
Комментарии:
1. Ваш внутренний запрос возвращает список строк. Они не могут использоваться в качестве параметра
IN
предложения (насколько мне известно, любой, кто знает другое, может исправить меня здесь). Вместо этого я бы рекомендовал использоватьINNER JOIN
Ответ №1:
Ваш внутренний выбор возвращает таблицу. Это нельзя использовать в качестве параметра для соответствия условию WHERE IN . Вместо этого попробуйте использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ
sum(decode(
select sum(dou.noukn)
from dou
join v_kzeiritsu on
dou.zeiritsu = v_kzeiritsu.zeiritsu
)) as noukn2;
Ответ №2:
Просто переместите свою sum
логику внутри select следующим образом:
(SELECT SUM(DOU$2.NOUKN)
FROM SDNISHI.V_KZEIRITSU V
WHERE DOU$2.ZEIRITSU = V.ZEIRITSU) AS NOUKN2
В случае, если он выдает ошибку агрегации, используйте sum(above query) AS NOUKN2
Ответ №3:
Ваш код очень странный. Например, кажется, предполагается, что V_KZEIRITSU
имеет одну строку. Но вы можете перенести это в FROM
предложение:
SELECT SUM(CASE WHEN DOU.ZEIRITSU = K.ZEIRITSU THEN DOU.NOUKN ELSE 0 END) AS NOUKN2
FROM DOU LEFT JOIN
V_KZEIRITSU K
ON 1=1 -- in case the table is really empty
Немного более разумной версией было бы:
SELECT SUM(DOU.NOUKN) AS NOUKN2
FROM DOU LEFT JOIN
V_KZEIRITSU K
ON DOU.ZEIRITSU = K.ZEIRITSU -- in case the table is really empty
Мне кажется маловероятным, что это то, что вы действительно намереваетесь. Если нет, я бы посоветовал вам задать новый вопрос с соответствующими теми же данными, желаемыми результатами и объяснением результатов. Не следует ожидать, что нерабочий запрос предоставит тот же уровень информации.
Комментарии:
1. я только что отредактировал, не могли бы вы проверить это еще раз? Спасибо: D
Ответ №4:
Я бы сказал, что на самом деле это так же просто, как
select sum(dou.noukn)
from dou
where dou.zeiritsu in (select zeiritsu from v_kzeiritsu)
(Я не уверен, что dou
такое (таблица? псевдоним?), Но я надеюсь, что ты это сделаешь.)
После того, как вы отредактировали вопрос, я редактирую ответ. Я отметил « --> this
» две строки, которые, на мой взгляд, могут помочь. Как и ранее, целое sum(case ...) as noukn2
заменяется простым sum(dou$2.noukn)
.
Обратите внимание, что — в Oracle — вы не можете использовать as
ключевое слово для псевдонима таблицы. Например:
- НЕТ:
from employees as e
- ДА:
from employees e
Вот ваш запрос:
SELECT DOU$2.CUSTCD AS CUSTCD,
DOU$2.CHUNO AS CHUNO,
DOU$2.LINNO AS LINNO,
DOU$2.SHIPDAYYM AS SHIPDAYYM,
SUM (DOU$2.NOUKN) AS NOUKN,
SUM (DOU$2.ZEIKN) AS ZEIKN,
SUM (dou$2.noukn) AS noukn2 --> this
FROM SDNISHI.T_HCHUMON_DOUSOU DOU$2
INNER JOIN SDNISHI.SY_KANRI KNR ON KNR.SHIPDAYYM = DOU$2.SHIPDAYYM
INNER JOIN SDNISHI.T_HCHUMON_MEI MEI
ON MEI.CUSTCD = DOU$2.CUSTCD
AND MEI.CHUNO = DOU$2.CHUNO
AND MEI.LINNO = DOU$2.LINNO
AND MEI.SHIPDAYYM = DOU$2.SHIPDAYYM
AND MEI.USEDNGKBN = '0'
AND MEI.CANCELKBN = '0'
LEFT OUTER JOIN SDNISHI.T_HCHUMON_HD HD
ON HD.CUSTCD = MEI.CUSTCD
AND HD.CHUNO = MEI.CHUNO
AND HD.LINNO = MEI.LINNO
AND HD.USEDNGKBN = '0'
AND HD.CANCELKBN = '0'
AND isnull (HD.CANKBN, '00') = '00'
JOIN v_keziritsu vk ON vk.zeiritsu = dou$2.zeiritsu --> this
WHERE DOU$2.USEDNGKBN = '0'
AND DOU$2.CANCELKBN = '0'
AND ( ( MEI.CHGDELKBN = '1'
AND MEI.HDOUSOUKBN = '02'
AND ( MEI.CHUSU > 0
OR MEI.BCHUSU > 0))
OR ( MEI.CHGDELKBN != '1'
AND HD.HDOUSOUKBN = '02'
AND ( MEI.CHKBTNFGA = '1'
AND HD.CHUSU > 0)
OR ( MEI.CHKBTNFGB = '1'
AND HD.BCHUSU > 0)))
GROUP BY DOU$2.CUSTCD,
DOU$2.CHUNO,
DOU$2.LINNO,
DOU$2.SHIPDAYYM
Комментарии:
1. Dou — псевдоним таблицы. Я пробую ваши решения, и появляется ошибка, не могли бы вы проверить мое изображение? imgur.com/a/aryCW1O
2. Извините, я не могу просматривать изображения. Отредактируйте отправленное вами первоначальное сообщение и скопируйте / вставьте эту ошибку в виде текста.
3. Я отредактировал. не могли бы вы проверить это еще раз: D, спасибо!
4. Я также отредактировал ответ. Посмотрите, пожалуйста.
5. я уже пробовал это решение раньше (используйте левое внешнее соединение), но сравнение данных неверно: (.