В 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;
Я также хотел бы добавить к результату последнюю строку с TOTAL как CITY и 9 (сумма всех значений в столбце AMOUNT) как AMOUNT. Ниже представлена визуализация.
Я борюсь с этим, потому что не могу найти способ выполнить другую операцию (в данном случае 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;
Буду благодарен за любую помощь.


Как насчет роллапа?
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 */
... при необходимости позаботьтесь и о ВЛАДЕЛЬЦЕ ... см. скрипку здесь