Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Sasha8111
0 / 0 / 1
Регистрация: 07.08.2008
Сообщений: 17
1

Энергоучет SQL

13.01.2012, 15:34. Просмотров 476. Ответов 0
Метки нет (Все метки)

Уважаемые специалисты,
помогите, пожалуйста, неученому в SQL'е советами.

Задача из области систем по энергоучету (см. структуру ниже):

Вложение 120188
в пунктах отмеченными ? знаком я откровенно говоря не разбираюсь, но делать надо.

упрощенная структура данных приблизительно такая:
Вложение 120189


В данной таблице показана минимально выборка (почасовка) на период времени с 12:00:00 до 13:00:00. говоря Вашим языком, такая таблица совсем не нормализированная. После нормализации (не знаю насколько корректной) получилось 4 таблицы:

таблица R_Energy:
Вложение 120190
таблица R_LEVEL:
Вложение 120191
таблица R_ZONE:
Вложение 120192
таблица R_LOG
Вложение 120193
таблица R_LOG имеет "отношения" к таблицам R_Energy и R_ZONE через ключи ID_Energy и ID_ZONE.

Далее пытаюсь соорудить перечень SQL запросов к такой "супер БД", по которым была бы возможность суммировать значения величин энергии в зависимости от выборки (почасовка, посуточно) и выводить результаты в отфильтрованном виде (по зонам (SPA, ресторан) и типу энергии (Электрика, Вода, Газ, Тепло)).
Пытаюсь соорудить SQL запросы в виде функции с некоторыми формальными параметрами:

ALTER PROCEDURE [dbo].[DoRep]
@ID_Energy int, /* ключ вида Энергии */
@ID_ZONE int, /* ключ вида зоны. если -1, то все зоны */
@DateFirst date, /* начальная дата */
@DateLast date, /* конечная дата */
@TimeFirst time(7), /* начальное время */
@TimeLast time(7), /* конечное время */
@Sample int /* выборка. 0 - почасовка, 1 посуточно */

Если данную процедуру вызвать, например, в следующем виде
exec DoRep 1000,-1, '2012-01-10', '2012-01-11', '00:00:00','11:00:00', 0
то результат будет в виде сумм почасовки по электрике по всем зонам за фиксированный период времени. На рисунке показан только некоторый фрагмент - по дате 2012-01-10.

Вложение 120194

Реализации такой функции видимо очень не оптимальна - в своем теле она вызывает еще несколько функций.

Например,
реализация SQL запроса для вывода отчета для посуточной выборки с фильтром по зонам:

Запрос 1
...
SELECT
R_LOG._Date as "Дата",
R_Energy.Energy_DESCR as "Энергия",
R_ZONE.ZONE_DESCR as "Зона",
SUM(R_LOG.Value) as "Сумма",
R_Energy.Unit as "Ед.Изм"

FROM R_LOG, R_Energy, R_ZONE
WHERE R_LOG.ID_Energy = @ID_Energy AND /* фильтр тип энергии */
R_LOG.ID_ZONE = @ID_ZONE AND /* фильтр зона */
R_LOG.ID_Energy = R_Energy.ID_Energy AND /* выводим по ключу описания типа энергии */
R_LOG.ID_ZONE = R_ZONE.ID_ZONE AND /* выводим по ключу описания зоны */
(
R_LOG._Date
BETWEEN
@DateFirst AND @DateLast /* промежуток даты */
)
GROUP BY R_LOG._Date, R_Energy.Energy_DESCR, R_ZONE.ZONE_DESCR, R_Energy.Unit

реализация SQL запроса для вывода отчета для посутоной выборки бес фильтра по зонам:

Запрос 2
...
SELECT
R_LOG._Date as "Дата",
R_Energy.Energy_DESCR as "Энергия",
SUM(R_LOG.Value) as "Сумма",
R_Energy.Unit as "Ед.Изм"

FROM R_LOG, R_Energy, R_ZONE
WHERE R_LOG.ID_Energy = @ID_Energy AND /* фильтр тип энергии: электрика */
R_LOG.ID_Energy = R_Energy.ID_Energy AND /* выводим по ключу описания типа энергии */
(
R_LOG._Date
BETWEEN
@DateFirst AND @DateLast /* промежуток даты */
)
GROUP BY R_LOG._Date, R_Energy.Energy_DESCR, R_Energy.Unit

Оба запроса реализованы каждый в отдельной функции, которые вызываются в основной процедуре DoRep.
Данный способ очевидно очень неоптимальный - наверное существуют варианты совмещения двух запросов в одну более сложно обвязанную логикой процедуру, но только у меня совсем не получается это сделать: в первом запросе иимет место ....SELECT R_ZONE.ZONE_DESCR .....Во втором запросе зона не рассматривается нигде, так как иначе будет неверно суммироваться значения энергии Value. Таких неоптимальных ситуаций получилось предостаточно - знаний не хватает.

В общем вопросы к Вам весьма примитивны - не судите строго:
1. Насколько удачно спланирована база?
2. Как оптималнее всего построить запросы к базе, так, что бы в конечном счете получилась одна параметризированная функция. Или может такой способ вообще не правильный ?

Всем большое спасибо!

Добавлено через 4 минуты
извините, можно не отвечать - ни одна таблица почему то не подгрузилась
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2012, 15:34
Ответы с готовыми решениями:

Как перейти с SQL 2003 на SQL 2005 без потери информации?
Здравствуйте всем! Подскажите пожалуйста как перейти с SQL 2003 на SQL 2005 без потери информации!...

sql query analyzer и sql enterprise manager выводят отличающиеся данные
Доброго времени суток, ALL! Софт: MS SQL 2000. Возникла следующая проблема: при запросе в query...

Где найти и бесплатно скачать SQL 2005 или SQL 2008
Привет всем. Кто нибудь знает откуда можно бесплатно скачать полную версию SQL 2005 или SQL 2008...

Вставка данных из Excel в SQL. При помощи запроса SQL....
Доброго времени суток. Не могли бы Вы мне помочь с SQL запросом, которй вставлял бы весь лист в ...

SQL Запросы. MS SQL. 3. Приложения, которые работают со всеми серверами БД
Всем доброго времени суток! Есть задача: Приложения, которые работают со всеми серверами БД. ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2012, 15:34

Где в SQL Server 2012 хранятся файлы c запросами (.sql)?
Я создал таблицы, и заполнил их с помощью кода, а не в ручную. Соответственно, у меня есть 2 файла...

Rational rose + sql 2008 on windows 7 ultimate with sql 2000 (where you can't create a new table)
Ситуация: установлена windows 7, на ней установлено: 1) SQL 2000, в котором невозможно создавать...

SQL Server - SQL ввод данных первичный и внешний ключи - ошибка синтаксиса
SQL Server - SQL ввод данных первичный и внешний ключи Проблема с вводом данных первичного ключа ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru