Советы по созданию сводного количества значений в других таблицах

#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’, но это ничего не исправило. Есть идеи о том, как заставить каждый столбец подсчитывать значения только для своей таблицы?