powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
14 сообщений из 39, страница 2 из 2
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40052321
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что же ни у кого внимания нету к теме?
Хотя бы опишите словами как это пошагово делается
Ну не знаю я как это делать в sql.

В Power Query делал так: сгруппировывал по соответствующему справочнику столбцу, далее добавлял столбец индекс, затем разгруппировывал. И так по каждому столбцу, соответствующему справочнику. Далее уже делил на отдельные таблицы-справочники. В таблице фактов оставлял столбцы-индексы и другие столбцы(сч-фак, дата, кол-во, сумма). Вот и все

А как в Sql получить этот результат?
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40052346
MoonRabbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Л
Что же ни у кого внимания нету к теме?
Хотя бы опишите словами как это пошагово делается
Ну не знаю я как это делать в sql.

В Power Query делал так: сгруппировывал по соответствующему справочнику столбцу, далее добавлял столбец индекс, затем разгруппировывал. И так по каждому столбцу, соответствующему справочнику. Далее уже делил на отдельные таблицы-справочники. В таблице фактов оставлял столбцы-индексы и другие столбцы(сч-фак, дата, кол-во, сумма). Вот и все

А как в Sql получить этот результат?


тут многие работающие, поэтому столь незначительные вопросы оставляют в лучшем случае на вечер. ))

я скачал скрипты ваших баз.
в целом получается что вам остается написать хранимку для заполнения справочных таблиц и основной из втянутого временного результата.

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

insert into [Клиент]([id_kl], [Клиент])

select
ROW_NUMBER() OVER(ORDER BY [Клиент] ASC),
[Клиент]
from [Baza_VR].[dbo].[vremen]
group by [Клиент]

--select * from [Клиент]

затем бы уже заполнил основную таблицу [prodagi] с привязкой к заполненным справочным таблицам.
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40052415
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MoonRabbit

тут многие работающие, поэтому столь незначительные вопросы оставляют в лучшем случае на вечер. ))

я и не против отложить до субботы - воскресенья) Лишь бы не бросили меня один на один с этой проблемой) Не справлюсь я сам
Спасибо за скрипт для справочников. Завтра попробую на работе между делом.
Хотя почему завтра?) - Я же вчера установил дома на ноут MS Sql. Сегодня уже опробую скрипт.

MoonRabbit

в целом получается что вам остается написать хранимку для заполнения справочных таблиц и основной из втянутого временного результата.

Правильно ли я понял что временная(она же промежуточная) база с таблицей при следующем заполнении данными должна очищаться от предыдущих данных?
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40052428
MoonRabbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Л

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

судя по тем файлам которые вы выкладываете, в промежуточную базу уже попадают обработанные (не изначальный массив) данные, с суммированием продаж по году/менеджеру/магазину и чему-то там еще.
Следовательно да, проще счищать и заполнять временную таблицу каждый раз, и раскидывать по итоговым таблицам также заново с их очисткой, я так думаю.
Либо при втягивании данных в MSSQL придется все сверять, где расхождения - апдейтить, где отсутсвует - добавлять и т.п.
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40052440
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MoonRabbit
обработанные (не изначальный массив) данные, с суммированием продаж по году/менеджеру/магазину

Да, данные обработаны. Только суммирование в рамках дня. Изначально одна счет фактура занимает одну строку, а каждому товару отведено две колонки - для количества и суммы. После Unpivot данные принимают тот вид, который представлен в примере.
Единственное, от даты остается только год, так как я непредусмотрительно не завернул исходную дату в одинарные кавычки.

Я так понял очищать придется только итоговые таблицы, а промежуточную надо будет пополнять.
Пока есть вопрос сколько будет уходить времени на заполнение таблицы фактов с проверкой четырех ключей.
Завтра подготовлю скрипты для справочников
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40052525
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MoonRabbit,
Спасибо!
Все заполняется!
Теперь бы таблицу prodagi заполнить с привязкой к справочникам.
Покажете как это делается?
В файле скрипты для заполнения справочников.
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40052674
MoonRabbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Л
MoonRabbit,
Спасибо!
Все заполняется!
Теперь бы таблицу prodagi заполнить с привязкой к справочникам.
Покажете как это делается?
В файле скрипты для заполнения справочников.


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

insert into [prodagi]
([id_kl], [id_mg], [id_gr], [id_tv], [СчетФактура], [Дата], [Кол-во], [Сумма])

select
(select id_kl from [Клиент] where [Клиент].[Клиент] = [Baza_VR].[dbo].[vremen].[Клиент]),
(select id_me from [Менеджер] where [Менеджер].[Менеджер] = [Baza_VR].[dbo].[vremen].[Менеджер]),
(select id_gr from [город_регион] where [город_регион].[регион] = [Baza_VR].[dbo].[vremen].[регион] and [город_регион].[Город] = [Baza_VR].[dbo].[vremen].[Город]),
(select id_tv from [Товар] where [Товар].[Товар] = [Baza_VR].[dbo].[vremen].[Товар]),
[СчетФактура],
[Дата],
[Кол-во],
[Сумма]
from [Baza_VR].[dbo].[vremen]

--select * from [prodagi]
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40052695
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MoonRabbit, все работает! Большое спасибо!
Завтра, если время будет, погоняю еще
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40053127
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все работает правильно!
Большое спасибо!

Однако у меня теперь другая проблема.
В файле описание проблемы.
Подскажите как в таких случаях поступают?
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40053148
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что я подумал?)
Возможно ли так: в итоговой базе иметь четыре общих справочника (на 2000-2021) и две таблицы фактов (таблица фактов 2000-2020 и таблица фактов 2021). Для заполнения таблицы фактов 2021 эта таблица будет связана со справочниками. А объединять через Union только таблицы фактов.
Возможно ли так?
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40053161
MoonRabbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Л
Что я подумал?)
Возможно ли так: в итоговой базе иметь четыре общих справочника (на 2000-2021) и две таблицы фактов (таблица фактов 2000-2020 и таблица фактов 2021). Для заполнения таблицы фактов 2021 эта таблица будет связана со справочниками. А объединять через Union только таблицы фактов.
Возможно ли так?


в принципе, я ожидал подобных вопросов, поэтому возвращаемся к нормальному обустройству БД и разбираемся пошагово

Михаил Л

в итоговой базе иметь четыре общих справочника (на 2000-2021)


если мы имеем справочные таблицы то счищать и перезаполнять их заново без перезаполнения скажем условно одной из таблиц фактов - возможное нарушение целостности данных. И чтобы этого избежать надо их тогда немного переделать.
Как бы делал я в данном случае:
в справочных таблицах на поле с ID добавил бы свойство IDENTITY, чтобы не заморачиваться с присвоением этого идентификатора.
Тогда при заполнении этих таблиц я бы просто проверял наличие значений, примерно так:

insert into [Клиент]([Клиент])
-- заполняем справочную таблицу, делаем практически все то же самое
select
[Клиент]
from [Baza_VR].[dbo].[vremen]
-- но добавляем условие когда данные по клиенту уже есть в справочной таблице и их добавлять не требуется
where
[Baza_VR].[dbo].[vremen].[Клиент] not in (select [Клиент] from [Клиент])

все это прелестно в случае когда в изначальных данных из 1С никто не балуется, например не переименовывает клиентов

Далее.
Михаил Л

две таблицы фактов (таблица фактов 2000-2020 и таблица фактов 2021).

а зачем?
структура таблиц одна, логически данные - единый массив по продажам, он интересен именно в целостном виде.
зачем разбивать по периодам, если мы запросами и так получим нужные данные и из одной таблицы, зачем постоянно держать в голове эту возможность и необходимость их union?
допустим в апреле начальник запросит данные по продажам какого-то менеджера за условно последние полгода или два года (тут надо выдернуть данные с ноября 2020 года из одной таблицы и выдернуть данные по текущему году с другой), имея все данные в одной таблице мы легким запросом просто выдергиваем то что нужно и выдаем готовый отчет, без ерундистики с объединениями
Опять же, если в изначальных данных никто не балуется, то пользуясь тем что у нас может пропасть необходимость перезаполнять справочники, мы можем не перезаполнять таблицу продаж каждый раз, а просто также добавить в операцию заполнения таблицы продаж
insert into [prodagi]
условие когда данные уже есть, и их вставлять не требуется
ну если на пальцах, то как-то так это все выглядит.
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40053197
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MoonRabbit

если мы имеем справочные таблицы то счищать и перезаполнять их заново без перезаполнения скажем условно одной из таблиц фактов - возможное нарушение целостности данных. И чтобы этого избежать надо их тогда немного переделать.
Как бы делал я в данном случае:
в справочных таблицах на поле с ID добавил бы свойство IDENTITY, чтобы не заморачиваться с присвоением этого идентификатора.
Тогда при заполнении этих таблиц я бы просто проверял наличие значений, примерно так:
...
все это прелестно в случае когда в изначальных данных из 1С никто не балуется, например не переименовывает клиентов

Этот вариант заполнения(вернее дополнения) справочников позволит иметь как одну, так и две привязанные таблицы фактов?
Я бы хотел попробовать оба варианта:
1 вариант: четыре перезаписываемых справочника и две таблицы фактов(тоже перезаписываемых. Только вероятнее всего таблица фактов 2000 - 2020 года после заполнения не будет требовать перезаписи. А вот таблица фактов 2021 будет перезаписываться чуть ли не каждый день);
2 вариант: четыре пополняемых справочника и одна пополняемая таблица фактов.
Примеры с переделанными таблицами смогу подготовить ко вторнику(в понедельник обычно много работы)

Насчет данных 1С и переименования значений справочников понял. Как только увидят раздвоения данных по, например, одному менеджеру - я объясню причину)

MoonRabbit
а зачем?
структура таблиц одна, логически данные - единый массив по продажам, он интересен именно в целостном виде.
зачем разбивать по периодам, если мы запросами и так получим нужные данные и из одной таблицы, зачем постоянно держать в голове эту возможность и необходимость их union?
...
Опять же, если в изначальных данных никто не балуется, то пользуясь тем что у нас может пропасть необходимость перезаполнять справочники, мы можем не перезаполнять таблицу продаж каждый раз, а просто также добавить в операцию заполнения таблицы продаж
insert into [prodagi]
условие когда данные уже есть, и их вставлять не требуется

Да, в итоге все данные склеиваются. Охота попробовать вариант с Union.
- условие когда данные уже есть, и их вставлять не требуется - Чтобы проверить данные на дубликаты - нужно же время? Или имеется ввиду не проверять факты на дубликаты, а дополнять по периодам, например, каждый день добавлять данные за прошлый день?

Так то мне суть понятна. Сразу скажу, сам я не справлюсь) Прошу заглядывать в тему и помогать решениями!
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40053894
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подготовил пример.
В принципе, на первый взгляд неопытного пользователя, все работает. Но все равно прошу проверить.

Что надо бы изменить на мой взгляд. Сейчас есть проверка на дубликаты только у справочников. Надо бы добавить проверку на дубликаты в таблицу prodagi. Сейчас с каждым выполнением запроса из файла 5 количество строк увеличивается. Как это предотвратить?
Может я не правильно что сделал?
...
Рейтинг: 0 / 0
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
    #40054546
Михаил Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу показать как при пополнении таблицы делать проверку на дублирующие строки?
Или, если можно, на дублирующие данные по столбцам? Например, год и номер счет фактуры уникальны. Возможно ли по ним проверять на дубликаты?
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]