SQL-запрос в Oracle для суммирования значений из столбца псевдонимов

В Oracle я хотел бы создать оператор SELECT в сочетании с UNION ALL для подсчета всех строк в некоторых таблицах (второй столбец) и присвоения описания каждой строке (первый столбец). Ниже показано, что у меня есть на самом деле, и результат.

SELECT 'Amsterdam' AS city, count(*) AS amount FROM A
UNION ALL
SELECT 'Berlin' AS city, count(*) AS amount FROM B
UNION ALL
SELECT ALL 'California' AS city, count(*) AS amount FROM C;
ГОРОД КОЛИЧЕСТВО Амстердам 3 Берлин 2 Калифорния 4

Я также хотел бы добавить к результату последнюю строку с TOTAL как CITY и 9 (сумма всех значений в столбце AMOUNT) как AMOUNT. Ниже представлена ​​визуализация.

ГОРОД КОЛИЧЕСТВО Амстердам 3 Берлин 2 Калифорния 4 ОБЩИЙ 9

Я борюсь с этим, потому что не могу найти способ выполнить другую операцию (в данном случае SUM) над несуществующим столбцом (CITY), поскольку он создается моим запросом. Это то, что я пытался сделать, но у меня получилось ORA-00942: table or view does not exist

SELECT city, amount 
FROM
    (SELECT 'Amsterdam' AS city, count(*) AS amount FROM A
     UNION ALL
     SELECT 'Berlin' AS city, count(*) AS amount FROM B
     UNION ALL
     SELECT ALL 'California' AS city, count(*) AS amount FROM C) t
UNION ALL
SELECT 'TOTAL' AS city, SUM(t.amount) AS amount FROM t;

Буду благодарен за любую помощь.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Как насчет роллапа?

SQL> with temp as
  2  -- this is your current query
  3  (
  4  SELECT 'Amsterdam' AS city, count(*) AS amount FROM A
  5  UNION ALL
  6  SELECT 'Berlin' AS city, count(*) AS amount FROM B
  7  UNION ALL
  8  SELECT ALL 'California' AS city, count(*) AS amount FROM C
  9  )
 10  -- your current query ends here
 11  select
 12    case when grouping_id(city) = 1 then 'Total' else city end as city,
 13    sum(amount) amount
 14  from temp
 15  group by rollup(city);

CITY           AMOUNT
---------- ----------
Amsterdam           3
Berlin              2
California          4
Total               9

SQL>

Или, как вы пробовали:

SQL> with temp as
  2  -- this is your current query
  3  (
  4  SELECT 'Amsterdam' AS city, count(*) AS amount FROM A
  5  UNION ALL
  6  SELECT 'Berlin' AS city, count(*) AS amount FROM B
  7  UNION ALL
  8  SELECT ALL 'California' AS city, count(*) AS amount FROM C
  9  )
 10  -- your current query ends here
 11  select * from temp
 12  union all
 13  select 'Total', sum(amount)
 14  from temp;

CITY           AMOUNT
---------- ----------
Amsterdam           3
Berlin              2
California          4
Total               9

SQL>

Как я вижу, у вас уникальные CITY имена. Вы можете использовать GROUP BY ROLLUP следующим образом:

SELECT COALESCE(CITY,'TOTAL'), SUM(AMOUNT) FROM
( -- YOUR QUERY
SELECT 'Amsterdam' AS city, count(*) AS amount FROM A
UNION ALL
SELECT 'Berlin' AS city, count(*) AS amount FROM B
UNION ALL
SELECT ALL 'California' AS city, count(*) AS amount FROM C
)
GROUP BY ROLLUP (CITY);

Другой вариант — прочитать количество строк с помощью таблицы Oracle USER_TABLES/ALL_TABLES:

Select Case TABLE_NAME
            When 'A_TBL' Then 'Amsterdam'
            When 'B_TBL' Then 'Berlin'
            When 'C_TBL' Then 'California'
      End "CITY",
      NUM_ROWS "AMOUNT"
From user_tables 
Where TABLE_NAME IN('A_TBL', 'B_TBL', 'C_TBL')
UNION ALL
Select 'TOTAL', Sum(NUM_ROWS)
From user_tables 
Where TABLE_NAME IN('A_TBL', 'B_TBL', 'C_TBL');
/*  R e s u l t :
CITY         AMOUNT
-----------  ------
Amsterdam         3
Berlin            2
California        4
TOTAL             9    */

... при необходимости позаботьтесь и о ВЛАДЕЛЬЦЕ ... см. скрипку здесь

Другие вопросы по теме