У меня этот SQL:
SELECT COUNT(*) as "With Gold" FROM user_accounts_gold WHERE level = 6
UNION
SELECT COUNT(*) as "No Gold" FROM user_accounts_bronze WHERE level = 6
На данный момент это выдает:
| With Gold |
-------------
| 17734 |
| 2388 |
Есть ли способ заставить это выводить так:
| With Gold | No Gold |
----------------------
| 17734 | 2388 |
Спасибо
Сделайте CROSS JOIN
вместо этого:
select * from
(SELECT COUNT(*) as "With Gold" FROM user_accounts_gold WHERE level = 6) ug
CROSS JOIN
(SELECT COUNT(*) as "No Gold" FROM user_accounts_bronze WHERE level = 6) ub
Как уже упоминалось, должна быть только одна таблица. Поэтому создайте представление для него. На лету, если хотите. Затем подсчитайте:
select
sum(metal = 'gold') as "With Gold",
sum(metal <> 'gold') as "No Gold"
from
(
select 'gold' as metal, level from user_accounts_gold
union all
select 'bronze' as metal, level from user_accounts_bronze
) one_table
where level = 6;
При постоянном просмотре (т.е. CREATE VIEW...
) это сводится к:
select
sum(metal = 'gold') as "With Gold",
sum(metal <> 'gold') as "No Gold"
from one_table
where level = 6;
и вы могли бы воспользоваться и в других запросах.
SELECT
COUNT(a.level) AS 'With Gold',
COUNT(b.level) as 'No Gold'
FROM user_accounts_gold a, user_accounts_bronze b
SELECT SUM("With Gold") AS "With Gold", SUM("No Gold") AS "No Gold"
FROM
(
SELECT COUNT(*) as "With Gold", 0 AS "No Gold" FROM user_accounts_gold WHERE level = 6
UNION
SELECT 0 AS "With Gold", COUNT(*) as "No Gold" FROM user_accounts_bronze WHERE level = 6
)
Еще один способ сделать это в подзапросе select
SELECT (SELECT COUNT(*) as "With Gold" FROM user_accounts_gold WHERE level = 6),
(SELECT COUNT(*) as "No Gold" FROM user_accounts_bronze WHERE level = 6)
оракул
SELECT (SELECT COUNT(*) as "With Gold" FROM user_accounts_gold WHERE level = 6),
(SELECT COUNT(*) as "No Gold" FROM user_accounts_bronze WHERE level = 6)
FROM dual
или вы можете сделать это с помощью агрегатной функции условия
SELECT MAX(CASE WHEN grp = 'With Gold' then val END) as 'With Gold',
MAX(CASE WHEN grp = 'No Gold' then val END) as 'No Gold'
FROM (
SELECT COUNT(*) val,'With Gold' grp FROM user_accounts_gold WHERE level = 6
UNION
SELECT COUNT(*) ,'No Gold' FROM user_accounts_bronze WHERE level = 6
)t
GROUP BY grp