Как использовать переменную в качестве оператора выбора, а затем суммировать несколько значений в переменной? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть несколько строк со следующими столбцами:

col1
col2
col3
col4

Я хочу сказать, если строки, где col3 равно col2 других строк, где col1 равно 'a111', то сумма col4 строк, где col3 равна col2 других строк, где col1 равна 'a111', а затем переименовать столбец суммы в "Total".

Пример таблицы с четырьмя столбцами и четырьмя строками:

col1 col2 col3 col4
---- ---- ---- ----
     a222 a333 4444
a111 a333
     a555 a444 1111
a111 a444

Я пробовал следующее, но оно не работает.

Declare
var1 = Select col2 from table1 where col1='a111';
var2 = Select col3 from table1 where col3=var1;
var3 = Select col4 from table1 where col3=var1;
Begin
If var2=var1
Then Select SUM(var3) As "Total";
End

Ожидаемый результат:

Total
5555

У меня нет самых сильных знаний в области программирования в целом или Oracle. Пожалуйста, задавайте любые вопросы, и я сделаю все возможное, чтобы ответить.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Это похоже на то, что могут обрабатывать иерархические запросы. Например. что-то вроде:

WITH your_table AS (SELECT NULL col1, 'a222' col2, 'a333' col3, 4444 col4 FROM dual UNION ALL
                    SELECT 'a111' col1, 'a333' col2, NULL col3, NULL col4 FROM dual UNION ALL
                    SELECT NULL col1, 'a555' col2, 'a444' col3, 1111 col4 FROM dual UNION ALL
                    SELECT 'a111' col1, 'a444' col2, NULL col3, NULL col4 FROM dual UNION ALL
                    SELECT 'a666' col1, 'a888' col2, NULL col3, NULL col4 FROM dual UNION ALL
                    SELECT NULL col1, 'a777' col2, 'a888' col3, 7777 col4 FROM dual)
SELECT col1,
       SUM(col4) col4_total
FROM   (SELECT connect_by_root(col1) col1,
               col4
        FROM   your_table
        CONNECT BY col3 = PRIOR col2
        START WITH col1 IS NOT NULL) -- start with col1 = 'a111')
GROUP BY col1;

COL1 COL4_TOTAL
---- ----------
a666       7777
a111       5555
0 голосов
/ 02 ноября 2018

Nevermind. Я считаю, что я сам определил ответ. Я слишком сложный, что я хотел. В любом случае, спасибо.

Ответ:

Select Sum(col4) as "Total" from table1 where col3 in (Select col2 from table1 where col1='a111')
0 голосов
/ 02 ноября 2018

Ваша логика запутанна и трудна для подражания без примера данных, которые у вас есть, и примера данных, которые вы хотите ... но перевод вашего псевдокода в sql дает:

Declare var1 = Выбрать col2 из таблицы1, где col1 = '[table2.col2 value]';

В моем запросе называется "найти"

var2 = Выбрать col3 из таблицы1, где col3 = var1; var3 = Выберите col4 из таблицы1, где col3 = var1;

Достигается присоединением таблицы к «находке»

Начало Если var2 = var1 Затем выберите SUM (var3) As "Total"; Конец

Достигается с суммой var3 только в тех строках, где var1 = var2, в "ifpart"

SELECT SUM(var3) FROM
(
  SELECT alsot1.col3 as var2, alsot1.col4 as var3
  FROM
    table1 alsot1
    INNER JOIN
    (
      SELECT t1.col2 as var1
      FROM table1 t1 INNER JOIN table2 t2 ON t1.col1 = t2.col2
     ) find
    ON find.var1 = alsot1.col3
  ) ifpart
WHERE
  var1 = var2

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

Кстати, вы четко сказали, что две таблицы объединяются через общее имя col2, но вы тогда в своем псевдокоде сказали, что таблицы объединяются в col1 = col2. Я следовал вашему псевдокоду

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...