SQL Оптимизация запросов: каков наилучший подход к использованию одного и того же показателя c дважды в таблице фактов? - PullRequest
0 голосов
/ 26 февраля 2020

У меня одна таблица измерений содержит бизнес-единицы и имена сотрудников, как показано ниже.

стол : тусклый

  business  |  emp_name 
 -----------|----------- 
  sales     |  A        
  sales     |  B        
  marketing |  C        
  product   |  D        
  IT        |  E     

Кроме того, таблица фактов, которая содержит транзакции между сотрудниками, как показано ниже. таблица: fct

  client_emp_name |  provider_emp_name |  value 
 -----------------|--------------------|-------- 
  A               |  C                 |     10 
  C               |  D                 |      5 
  C               |  B                 |     10 

Я хотел бы написать запрос, чтобы найти сумму значений для каждого бизнеса как клиентов, так и поставщиков (включая бизнес-единицы без транзакций) желаемый результат

  business  |  provider_total_value |  client_total_value 
 -----------|-----------------------|--------------------- 
  sales     |                    10 |                  10 
  marketing |                    15 |                   0 
  product   |                     0 |                   5 
  IT        |                     0 |                   0 

Каков наилучший способ структурировать запрос SQL для этого случая? У меня есть следующий запрос, который дает точные результаты, но я не уверен, что это оптимальный способ решить эту проблему.

With provider as (
    SELECT
        d.business,
        SUM(f.value) as provider_total_value
    FROM fct as f
        right join  dimension as d on d.emp_name = f.provider_emp_name 
    Group by 1
),

client as (
    SELECT
        d.business,
        SUM(f.value) as client_total_value
    FROM fct as f
        right join  dimension as d on d.emp_name = f.client_emp_name 
    Group by 1
)


Select
    p.business,
    COALESCE(p.provider_total_value, 0) as provider_total_value,
    COALESCE(c.client_total_value, 0) as client_total_value
From provider as p
Inner join client as c on c.business = p.business

Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2020

Можете ли вы предоставить схему для таблицы trades ?

Я думаю, что написанный вами запрос эффективен. Для дальнейшего улучшения я бы использовал целочисленный тип данных для первичного ключа (бизнес), чем символьно-строковый тип данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...