|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
Что же ни у кого внимания нету к теме? Хотя бы опишите словами как это пошагово делается Ну не знаю я как это делать в sql. В Power Query делал так: сгруппировывал по соответствующему справочнику столбцу, далее добавлял столбец индекс, затем разгруппировывал. И так по каждому столбцу, соответствующему справочнику. Далее уже делил на отдельные таблицы-справочники. В таблице фактов оставлял столбцы-индексы и другие столбцы(сч-фак, дата, кол-во, сумма). Вот и все А как в Sql получить этот результат? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2021, 14:41 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
Михаил Л Что же ни у кого внимания нету к теме? Хотя бы опишите словами как это пошагово делается Ну не знаю я как это делать в 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] с привязкой к заполненным справочным таблицам. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2021, 15:44 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
MoonRabbit тут многие работающие, поэтому столь незначительные вопросы оставляют в лучшем случае на вечер. )) я и не против отложить до субботы - воскресенья) Лишь бы не бросили меня один на один с этой проблемой) Не справлюсь я сам Спасибо за скрипт для справочников. Завтра попробую на работе между делом. Хотя почему завтра?) - Я же вчера установил дома на ноут MS Sql. Сегодня уже опробую скрипт. MoonRabbit в целом получается что вам остается написать хранимку для заполнения справочных таблиц и основной из втянутого временного результата. Правильно ли я понял что временная(она же промежуточная) база с таблицей при следующем заполнении данными должна очищаться от предыдущих данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2021, 18:19 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
Михаил Л Правильно ли я понял что временная(она же промежуточная) база с таблицей при следующем заполнении данными должна очищаться от предыдущих данных? судя по тем файлам которые вы выкладываете, в промежуточную базу уже попадают обработанные (не изначальный массив) данные, с суммированием продаж по году/менеджеру/магазину и чему-то там еще. Следовательно да, проще счищать и заполнять временную таблицу каждый раз, и раскидывать по итоговым таблицам также заново с их очисткой, я так думаю. Либо при втягивании данных в MSSQL придется все сверять, где расхождения - апдейтить, где отсутсвует - добавлять и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2021, 19:05 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
MoonRabbit обработанные (не изначальный массив) данные, с суммированием продаж по году/менеджеру/магазину Да, данные обработаны. Только суммирование в рамках дня. Изначально одна счет фактура занимает одну строку, а каждому товару отведено две колонки - для количества и суммы. После Unpivot данные принимают тот вид, который представлен в примере. Единственное, от даты остается только год, так как я непредусмотрительно не завернул исходную дату в одинарные кавычки. Я так понял очищать придется только итоговые таблицы, а промежуточную надо будет пополнять. Пока есть вопрос сколько будет уходить времени на заполнение таблицы фактов с проверкой четырех ключей. Завтра подготовлю скрипты для справочников ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2021, 20:32 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
MoonRabbit, Спасибо! Все заполняется! Теперь бы таблицу prodagi заполнить с привязкой к справочникам. Покажете как это делается? В файле скрипты для заполнения справочников. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2021, 08:28 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
Михаил Л 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] ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2021, 17:44 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
MoonRabbit, все работает! Большое спасибо! Завтра, если время будет, погоняю еще ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2021, 19:16 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
Все работает правильно! Большое спасибо! Однако у меня теперь другая проблема. В файле описание проблемы. Подскажите как в таких случаях поступают? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2021, 12:30 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
Что я подумал?) Возможно ли так: в итоговой базе иметь четыре общих справочника (на 2000-2021) и две таблицы фактов (таблица фактов 2000-2020 и таблица фактов 2021). Для заполнения таблицы фактов 2021 эта таблица будет связана со справочниками. А объединять через Union только таблицы фактов. Возможно ли так? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2021, 14:45 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
Михаил Л Что я подумал?) Возможно ли так: в итоговой базе иметь четыре общих справочника (на 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] условие когда данные уже есть, и их вставлять не требуется ну если на пальцах, то как-то так это все выглядит. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2021, 15:56 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
MoonRabbit если мы имеем справочные таблицы то счищать и перезаполнять их заново без перезаполнения скажем условно одной из таблиц фактов - возможное нарушение целостности данных. И чтобы этого избежать надо их тогда немного переделать. Как бы делал я в данном случае: в справочных таблицах на поле с ID добавил бы свойство IDENTITY, чтобы не заморачиваться с присвоением этого идентификатора. Тогда при заполнении этих таблиц я бы просто проверял наличие значений, примерно так: ... все это прелестно в случае когда в изначальных данных из 1С никто не балуется, например не переименовывает клиентов Этот вариант заполнения(вернее дополнения) справочников позволит иметь как одну, так и две привязанные таблицы фактов? Я бы хотел попробовать оба варианта: 1 вариант: четыре перезаписываемых справочника и две таблицы фактов(тоже перезаписываемых. Только вероятнее всего таблица фактов 2000 - 2020 года после заполнения не будет требовать перезаписи. А вот таблица фактов 2021 будет перезаписываться чуть ли не каждый день); 2 вариант: четыре пополняемых справочника и одна пополняемая таблица фактов. Примеры с переделанными таблицами смогу подготовить ко вторнику(в понедельник обычно много работы) Насчет данных 1С и переименования значений справочников понял. Как только увидят раздвоения данных по, например, одному менеджеру - я объясню причину) MoonRabbit а зачем? структура таблиц одна, логически данные - единый массив по продажам, он интересен именно в целостном виде. зачем разбивать по периодам, если мы запросами и так получим нужные данные и из одной таблицы, зачем постоянно держать в голове эту возможность и необходимость их union? ... Опять же, если в изначальных данных никто не балуется, то пользуясь тем что у нас может пропасть необходимость перезаполнять справочники, мы можем не перезаполнять таблицу продаж каждый раз, а просто также добавить в операцию заполнения таблицы продаж insert into [prodagi] условие когда данные уже есть, и их вставлять не требуется Да, в итоге все данные склеиваются. Охота попробовать вариант с Union. - условие когда данные уже есть, и их вставлять не требуется - Чтобы проверить данные на дубликаты - нужно же время? Или имеется ввиду не проверять факты на дубликаты, а дополнять по периодам, например, каждый день добавлять данные за прошлый день? Так то мне суть понятна. Сразу скажу, сам я не справлюсь) Прошу заглядывать в тему и помогать решениями! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2021, 20:06 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
Подготовил пример. В принципе, на первый взгляд неопытного пользователя, все работает. Но все равно прошу проверить. Что надо бы изменить на мой взгляд. Сейчас есть проверка на дубликаты только у справочников. Надо бы добавить проверку на дубликаты в таблицу prodagi. Сейчас с каждым выполнением запроса из файла 5 количество строк увеличивается. Как это предотвратить? Может я не правильно что сделал? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 09:30 |
|
Как правильно и практично разбить исходную таблицу на табл-факт и табл-справочники
|
|||
---|---|---|---|
#18+
Прошу показать как при пополнении таблицы делать проверку на дублирующие строки? Или, если можно, на дублирующие данные по столбцам? Например, год и номер счет фактуры уникальны. Возможно ли по ним проверять на дубликаты? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 13:08 |
|
|
start [/forum/topic.php?fid=46&gotonew=1&tid=1684943]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
8ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 173ms |
0 / 0 |