| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MS SQL Server > SQL Энергоучет |
| Автор: Aleksandr8111 13.1.2012, 15:10 | ||||||
| Уважаемые специалисты, помогите, пожалуйста, неученому в SQL'е советами. Задача из области систем по энергоучету (см. структуру в приложенном файле): в структурной схеме есть элементы обведенные ? знаком - то в чем я, простите, не разбираюсь, но делать надо. упрощенная структура данных показана в таблице "сводная таблица данных": В данной таблице показана минимально выборка (почасовка) на период времени с 12:00:00 до 13:00:00. говоря Вашим языком, такая таблица совсем не нормализированная. После нормализации (не знаю насколько корректной) получилось 4 таблицы: R_Energy, R_LEVEL, R_ZONE, R_LOG таблица R_LOG имеет "отношения" к таблицам R_Energy и R_ZONE через ключи ID_Energy и ID_ZONE. Далее пытаюсь соорудить перечень SQL запросов к такой "супер БД", по которым была бы возможность суммировать значения величин энергии в зависимости от выборки (почасовка, посуточно) и выводить результаты в отфильтрованном виде (по зонам (SPA, ресторан) и типу энергии (Электрика, Вода, Газ, Тепло)). Пытаюсь соорудить SQL запросы в виде функции с некоторыми формальными параметрами:
exec DoRep 1000,-1, '2012-01-10', '2012-01-11', '00:00:00','11:00:00', 0 то результат будет в виде сумм почасовки по электрике по всем зонам за фиксированный период времени. На рисунке показан только некоторый фрагмент - по дате 2012-01-10 (таблица "результат запроса") Реализации такой функции видимо очень не оптимальна - в своем теле она вызывает еще несколько функций. Например, реализация SQL запроса вывода отчета для посуточной выборки с фильтром по зонам: Запрос 1
реализация SQL запроса вывода отчета для посутоной выборки беp фильтра по зонам: Запрос 2 ...
Оба запроса реализованы каждый в отдельной функции, которые вызываются в основной процедуре DoRep. Данный способ очевидно очень неоптимальный - наверное существуют варианты совмещения двух запросов в одну более сложно обвязанную логикой процедуру, но только у меня совсем не получается это сделать: в первом запросе иимет место ....SELECT R_ZONE.ZONE_DESCR ..... Во втором запросе зона не рассматривается нигде, так как иначе будет неверно суммироваться значения энергии Value. Таких неоптимальных ситуаций получилось предостаточно - знаний не хватает. В общем вопросы к Вам весьма примитивны - не судите строго: 1. Насколько удачно спланирована база? 2. Как оптималнее всего построить запросы к базе, так, что бы в конечном счете получилась одна параметризированная функция. Или может такой способ вообще не правильный ? Всем большое спасибо! |
| Автор: Aleksandr8111 13.1.2012, 18:46 | ||||
Не знаю...но так ведь книжка пишет. Если имеет место избыточность, то нормализация нужна, что бы сущности типа "Электрика", "SPA", и т.д. были объявлены только один раз. Да и в R_LOG сохранять число 1000 (два байта) рациональнее чем слово из девати чаров (девяти байт) "Электрика". В общем я ж не спец, но во всех методиках просто заставляют приводить таблицы к 1NF, 2NF, 3NF и т.д.
Вы хотели сказать не оптимальным ? |
| Автор: Zloxa 13.1.2012, 19:58 | ||||
1) Исходная таблица представлена в 1НФ, если я не ошибаюсь 2) Чтобы прямтаки заставляли - не припомню. 3) В этих же методиках, обычно пишут, что нормализация в значительной мере усложняет построение аналитических запросов, недоумеваю, почему читающие не доходят до этого места при чтении методик
Так то можно было слово "Электрика" сократить до "Э", был бы один байт. И таки зачем? Обычно нормализация используется для облегчения обеспечения согласованности и целостности данных. В вашем случае, я так понимаю, вы получаете исходные данные откуда то извне - нет? Вероятнее всего на той стороне обеспечен некий комплекс мер, чтобы значение "Электроника" не могло быть представлено как "ЭЛЕКТРОНИКА" или "Электр." - тот самый случай, для не допущения которого нормализация могла бы быть полезной. А так, получается, вы нормализуете исходные данные, лишь чтобы потом их обратно денормализовать? |
| Автор: Aleksandr8111 17.1.2012, 13:58 | ||
| И все таки, сильного из любопытства ради. возможно ли в одном запросе объеденить всякую там логику, например первый вариант запроса
Если строки, отмеченные /*!*/ закоментировать ( /*R_ZONE.ZONE_DESCR*/, /*R_ZONE*/, /*R_ZONE.ZONE_DESCR*/), то получится второй вариант запроса, который можно сохранить в отдельный файл и использовать, но хотелось бы у Вас спросить, а можно ли два запроса объеденить в один, через какую то логику - может какие то дополнительные операторы SQL. Пока все что у меня вышло - это реализовать два запроса в отдельные процедуры (в одной - целый запрос, в другой с закоментированными /*!*/ или поудалять их вообще) и вызывать эти два запроса из третей процедуры через IF, ELSE. Спасибо. |
| Автор: Zloxa 17.1.2012, 14:05 |
| Чем вас не устраивает предложенное вами же решение? |