#sql #oracle
#sql #Oracle
Вопрос:
У меня есть несколько таблиц со столбцом состояния в каждой. Я хочу отобразить сводку подсчетов каждого статуса для каждой таблицы. Что-то вроде этого:
=============================================
Status | Table A | Table B | Table C |
Status A | 3 | 8 | 2 |
Status B | 5 | 7 | 4 |
==============================================
Мне нужна помощь в начале работы, поскольку я не уверен, как подойти к этой проблеме. Я могу выполнять простые функции ПОДСЧЕТА, такие как:
SELECT status, count(status) from TABLE_A group by status
Но я не уверен, как заполнить данные в нужной мне форме или как, по возможности, использовать имена таблиц в качестве заголовков столбцов. Я был бы признателен за указание правильного направления. Спасибо!
Ответ №1:
Может быть, попробуйте выполнить левые соединения после того, как вы рассчитали количество для каждой таблицы отдельно.Что-то вроде:
select distinct t1.status,
count(t1.status) as [tableA],
t2.TableB,
t3.TableC from Table A t1
left join (
select distinct status,
count(status) as [TableB] from Table B
group by status
) t2 on t1.status=t2.status
left join (
select distinct status,
count(status) as [TableC] from Table C
group by status
) t3 on t1.status=t3.status
group by t1.Status
Ответ №2:
Я бы использовал union all
и агрегацию:
select status, sum(a) as a, sum(b) as b, sum(c) as c
from ((select status, count(*) as a, 0 as b, 0 as c
from tablea
group by status
) union all
(select status, 0, count(*), 0
from tableb
group by status
) union all
(select status, 0, 0, count(*)
from tablea
group by status
)
) abc
group by status;
Это гарантирует отображение всех строк, даже если в одной или нескольких таблицах отсутствуют некоторые значения статуса.
Ответ №3:
возможно, используется соединение по левому краю
select t.status, a.cnt A, b.cnt B,c.cnt C
from(
select status
from tableA
union
select status
from tableB
select status
from tableC
) t
left join (
select status, count(*) cnt
from tableA
group by status
) a ON on t.status = a.status
left join (
select status, count(*) cnt
from tableB
group by status
) b ON on t.status = b.status
left join (
select status, count(*) cnt
from tableC
group by status
) c ON on t.status = c.status
Комментарии:
1. Третьим псевдонимом должен быть C 🙂
2. Спасибо! Я попробовал это, и я получаю нужный мне формат, но количество для каждого столбца одинаковое. Я пытался использовать ‘distinct’, но это ничего не исправило. Есть идеи о том, как заставить каждый столбец подсчитывать значения только для своей таблицы?