Полное объединение и равномерное распределение на основе количества в SQL - PullRequest
0 голосов
/ 04 июля 2018

У меня есть две таблицы, к которым я хочу присоединиться:

Таблица A

  Date     Gran1     Gran2     Gran3 
1/1/18         A         B        CD
1/1/18         A         B        EF
1/2/18         A         B        GF
1/2/18         A         B        EF
1/2/18         A         B        FR
1/2/18         A         L        EF

Таблица B

  Date     Gran1     Gran2     Value1    Value2
1/1/18         A         B        100       150
1/2/18         A         B        200        80
1/2/18         A         L        500        30

Таблица B не имеет той же степени детализации, что и таблица A. Я хочу присоединить таблицу B к таблице A и распределить значения, к которым я присоединяюсь, по количеству событий Date, Gran1 и Gran2.

Мой конечный результат должен выглядеть так:

  Date     Gran1     Gran2     Gran3    Value1     Value2
1/1/18         A         B        CD        50         75
1/1/18         A         B        EF        50         75
1/2/18         A         B        GF     66.67      26.67  
1/2/18         A         B        EF     66.67      26.67
1/2/18         A         B        FR     66.67      26.67
1/2/18         A         L        EF       500         30

Любая помощь будет отличной, спасибо!

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы можете попробовать этот запрос

Select a1.date1, 
        a1.gran1, 
        a1.gran2,
        a1.gran3,
        (b.value1/a2.xCount) as value1, 
        (b.value2/a2.xCount) as value2
from @tableA A1
Inner join @tableB B on A1.date1 = B.date1 
                    and a1.gran1 = b.gran1 
                    and a1.gran2 = b.gran1
inner join (select date1, gran1, gran2, count(*) xCount 
                from  @tableA 
                group by date1, gran1, gran2) A2 on A1.date1 = A2.date1 
                                                and a1.gran1 = a2.gran1 
                                                and a1.gran2 = a2.gran2
0 голосов
/ 04 июля 2018

Будет ли этот запрос работать?

SELECT a.date,
a.gran1,
a.gran2,
a.gran3,
b.value1/gran_count AS value1,
b.value2/gran_count AS value2
FROM table_a a
INNER JOIN table_b b
  ON (a.date = b.date
  AND a.gran1 = b.gran1
  AND a.gran2 = b.gran2)
INNER JOIN (
  SELECT date, gran1, gran2, count(*) AS gran_count
  FROM table_a
  GROUP BY date, gran1, gran2
) sub ON (a.date = sub.date
  AND a.gran1 = sub.gran1
  AND a.gran2 = sub.gran2);

У меня нет доступа к SQL прямо сейчас, поэтому я не могу проверить данные (или даже если я что-то пропустил в синтаксисе), но я пытаюсь найти СЧЕТ каждой комбинации даты / gran1 / gran2 в подзапросе, а затем использовать его в делении основного запроса.

И table_b, и подзапрос (который я назвал "sub") объединяются в table_a.

Возможно, есть более эффективный способ выполнить этот запрос, используя два объединения вместо трех, но сейчас ничего не приходит в голову.

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