Получить полную детализацию разреженной таблицы фактов

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

Когда я детализирую по продукту агрегированные результаты для пиццы, которой нет в результате. Но я хочу с 0 значениями, так как unit_sold = 0.

Решение состоит в том, чтобы соединить таблицу продуктов с таблицей фактов с помощью левого внешнего соединения. Тогда я смогу получить желаемый результат.


  • Но когда я режу с другим измерением, таким как местоположение или время, эти продукты снова отсутствуют в результате.

  • Внешнее соединение предоставляет пустой столбец для других размерных внешних ключей, поэтому предложение WHERE снова удалит их.


Как я могу решить проблему? (использую РОЛАП)

Использование условия соединения - хорошая идея, как ответили некоторые люди. Но мне нужно более общее решение.

Например,

Таблица 1

 person      birth year       death year

 a          1950               2006
 b          1952               2008
 c          1960               2007
 d          1953               1990

Я хочу получить год за годом количество людей, родившихся в период с 1950 по 1953 год и умерших в 2006-2008 годах.

Нравиться

birth = 1950   death = 2006   count = 1
birth = 1951   death = 2006   count = 0
...

Можем ли мы справиться с этим сценарием, используя условия соединения и соответствующие условия.


person Thamalu Piyadigama    schedule 30.11.2019    source источник
comment
Переместите условия WHERE в условие JOIN.   -  person Nick    schedule 30.11.2019
comment
Отвечает ли это на ваш вопрос? SQL Left Join не возвращает все результаты   -  person Nick    schedule 30.11.2019
comment
Пожалуйста, предоставьте образцы данных и желаемые результаты.   -  person Gordon Linoff    schedule 30.11.2019
comment
Спасибо @Nick, это сработает. Однако все же мне хотелось бы знать, есть ли какое-то общее решение, которое можно реализовать в кубах OLAP.   -  person Thamalu Piyadigama    schedule 30.11.2019
comment
Например, когда у нас есть два измерения, и мы выполняем сокращение диапазона и детализацию в каждом измерении. Как мы можем получить все результаты, соответствующие каждой ячейке детализации в кубе, если таблица фактов разрежена.   -  person Thamalu Piyadigama    schedule 30.11.2019


Ответы (1)


Вы хотите LEFT JOIN, а затем снова LEFT JOIN. Затем условия помещаются в предложение on. Что-то вроде этого:

select . . .
from products p left join
     fact f
     on p.product_id = f.product_id left join
     timedim td
     on f.time_id = td.time_id and
        td.month = 'January'
person Gordon Linoff    schedule 30.11.2019
comment
Использование условия соединения вместо условия where является хорошей идеей. Однако я все еще нахожу лучшее решение. - person Thamalu Piyadigama; 30.11.2019