2013-07-25 2 views
1

Я пытаюсь играть с DB Oracle. Я пытаюсь суммировать два столбца из одной строки и выводить итог на лету. Однако я не могу заставить его работать. Вот код, который у меня есть.Вычислить несколько столбцов с помощью подзапроса

SELECT a.name , SUM(b.sequence + b.length) as total 
FROM (
    SELECT a.name, a.sequence, b.length 
    FROM tbl1 a, tbl2 b 
    WHERE b.sequence = a.sequence 
    AND a.loc <> -1 
    AND a.id='10201' 
    ORDER BY a.location 
) 

Внутренний запрос работает, но я не могу заставить новый запрос и подзапрос работать вместе.

Вот пример таблицы я использую:

...[name][sequence][length]... 
...['aa']['100000']['2000']... 
      ... 
...['za']['200000']['3001']... 

А вот выход я хотел бы:

[name][ total ] 
['aa']['102000'] 
      ... 
['za']['203001'] 

Помощь высоко ценится, спасибо!

ответ

0

SUM() Количество сумм в строках. Вместо этого замените его на sequence + length.

... или если есть значения NULL, встречающиеся в столбцах sequence или length, используйте: COALESCE(sequence, 0) + COALESCE(length, 0).

Или, если ваше намерение действительно привело к выполнению общей суммы (т. Е. Суммирования суммы всех итогов и длин для каждого пользователя), добавьте GROUP BY a.name после окончания подзапроса.

BTW: вы не должны ссылаться на внутренние псевдонимы, используемые внутри подзапроса, извне этого подзапроса. Некоторые серверы DB позволяют это (и у меня нет удобного доступа к серверу Oracle прямо сейчас, поэтому я могу проверить его), но это не очень хорошая практика.

Я думаю, что вы после это что-то вроде:

SELECT a.name, 
     SUM(B.sequence + B.length) AS total 
FROM Tbl1 A 
     INNER JOIN Tbl2 B 
     ON B.sequence = A.sequence 
WHERE A.loc <> -1 
    AND A.id = 10201 
     GROUP BY a.name 
     ORDER BY A.location 
+0

Привет, Курт, мне нужно общее количество. Я попробовал GROUP BY a.name, но он говорит, что a.name является недопустимым идентификатором. Даже без него последовательность + длина терпит неудачу. – bigbitecode

+0

Это потому, что вы ссылались на внутренний псевдоним из подзапроса. Я добавил запрос, который, как я думаю, будет работать на мой ответ ... – Curt

+0

Спасибо. Да, это именно то, что я искал. Подзапрос не нужен. Спасибо, Курт! – bigbitecode

0

Ваш запрос с подзапроса терпит неудачу по нескольким причинам:

  • используется псевдоним таблицы a, но она не определена.
  • Вы используете псевдоним таблицы b, но он не определен.
  • У вас есть sum() в статье select с неагрегированными столбцами, но нет group by.

Кроме того, у вас есть order by в подзапросе, который разрешен синтаксически, но игнорируется.

Вот лучший способ написать запрос без подзапроса:

SELECT t1.name, (t1.sequence + t2.length) as total 
FROM tbl1 t1 join 
    tbl2 t2 
    on t1.sequence = t2.sequence 
where t1.loc <> -1 AND t1.id = '10201' 
ORDER BY t1.location; 

Обратите внимание на использование правильного join синтаксиса, использование псевдонимов, которые имеют смысл, и простой расчет на этом уровне.

Вот версия с подзапроса:

select name, (sequence + length) as total 
from (SELECT t1.name, t1.sequence, t2.length 
     FROM tbl1 t1 join 
      tbl2 t2 
      on t1.sequence = t2.sequence 
     where t1.loc <> -1 AND t1.id = '10201' 
    ) t 
ORDER BY location; 

Обратите внимание, что order by происходит на внешнем уровне. И я дал подзапрос псевдоним.Это не требуется строго, но, как правило, хорошая идея.

Смежные вопросы