MySQL UNION: как получить данные в два столбца

0

У меня этот 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    |

Спасибо

  • 1
    Почему у вас разные таблицы для золотых и бронзовых счетов?
  • 0
    Не я, клиент.
Теги:
union

5 ответов

3

Сделайте 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
0

Как уже упоминалось, должна быть только одна таблица. Поэтому создайте представление для него. На лету, если хотите. Затем подсчитайте:

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;

и вы могли бы воспользоваться и в других запросах.

0

SELECT COUNT(a.level) AS 'With Gold', COUNT(b.level) as 'No Gold' FROM user_accounts_gold a, user_accounts_bronze b

  • 0
    Не вернет правильное количество.
  • 0
    если бы он добавил предложение WHERE для проверки уровня, это можно было бы сделать. Я просто забыл предложение WHERE для фильтрации значений уровня с 6
Показать ещё 3 комментария
0
    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
    )
0

Еще один способ сделать это в подзапросе 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню