Извини, мне нужно спрятаться.

#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. я уже пробовал это решение раньше (используйте левое внешнее соединение), но сравнение данных неверно: (.