Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Энергоучет SQL  [new]
Sasha8111
Member

Откуда:
Сообщений: 33
Уважаемые специалисты,
помогите, пожалуйста, неученому в 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 запросы в виде функции с некоторыми формальными параметрами:

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 (таблица "результат запроса")

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

Например,
реализация 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. Как оптималнее всего построить запросы к базе, так, что бы в конечном счете получилась одна параметризированная функция. Или может такой способ вообще не правильный ?

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

К сообщению приложен файл. Размер - 34Kb
13 янв 12, 20:04    [11902340]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Напишите в форум "Работа". И предполагаемый бюджет...
13 янв 12, 21:56    [11902733]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6532
Способ неправильный. Пжлста =)
13 янв 12, 23:32    [11903139]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
Александр1969
Guest
Sasha8111
В общем вопросы к Вам весьма примитивны - не судите строго:
1. Насколько удачно спланирована база?
2. Как оптималнее всего построить запросы к базе, так, что бы в конечном счете получилась одна параметризированная функция.

1) На 3 балла по 5-бальной шкале
2) Так, чтобы запросы обеспечивали минимальное время отклика с наиболее оптимальным потреблением ресурсов.
14 янв 12, 00:57    [11903400]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
Sasha8111
Member

Откуда:
Сообщений: 33
автор Александр1969
1) На 3 балла по 5-бальной шкале

А какие меры нужно предпринять, что бы по пяти бальной шкале, хоть бы на 4 тянуло....мне тут на других форумах советуют вообще не нормализовывать
14 янв 12, 15:44    [11904310]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
куда уж нам
Guest
Sasha8111
автор Александр1969
1) На 3 балла по 5-бальной шкале

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

проведите взаимную калибровку, ваши балльные вилы могут разные круги на воде выдавать.

читвёрки, питёрки... софтвейр девелопмент мля.
14 янв 12, 18:06    [11904679]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
Sasha8111
Member

Откуда:
Сообщений: 33
автор куда уж нам
софтвейр девелопмент


ну если бы был софтвейр девелопментом по СУБД, то видимо за такими вопросами на форум бы не обращался.....
У меня головная задача та, которая в с структуре до составной "драйвер OLEDB/ODBC".
А тут приходится еще и в базах данных, хоть как то, разобратся.
С точки зрения СУБД данная задача не есть сложной, поэтому решил решить ее самостоятельно и уже решил - работает, вопрос исключительно в реализации - поэтому и попытался обсудить на форуме.

Мне кажется, основная проблема программистского сообщества иногда заключается в излишнем высокомерии, которого не встретишь среди специалистов инженерных категорий другого профиля.
14 янв 12, 23:44    [11905813]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Sasha8111
Мне кажется, основная проблема программистского сообщества иногда заключается в излишнем высокомерии, которого не встретишь среди специалистов инженерных категорий другого профиля.
Зато модераторы программисткого сообщество строго выпиливают офттоп. Поэтому не надо искушать.

Сообщение было отредактировано: 14 янв 12, 23:50
14 янв 12, 23:50    [11905830]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Sasha8111
Мне кажется, основная проблема программистского сообщества иногда заключается в излишнем высокомерии, которого не встретишь среди специалистов инженерных категорий другого профиля.

Неправда.
PS Когда рынок сужается, специалисты звереют. Когда расширяется - добреют.
PPS Хотите быстрых бесплатных решений - пишите на сишарпе. Когда задача перерастает определённую планку - нанимайте людей... Россия, слава богу, прощается с теми временами, когда каждый в гараже был сам - себе механик, инженер и конструктор...
PPPS Ничнего личного. Если обидел - извините.
15 янв 12, 00:56    [11905975]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
Sasha8111
Member

Откуда:
Сообщений: 33
Единственное, что ходел бы напоследок спросить, что бы больше не наступать на одни и те же грабли, чем данная тема (задача) отличается от тех, которые вполне активно обсуждаются на форуме, как говорится, "бескорыстно"?
15 янв 12, 01:13    [11905985]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Sasha8111
Единственное, что ходел бы напоследок спросить, что бы больше не наступать на одни и те же грабли, чем данная тема (задача) отличается от тех, которые вполне активно обсуждаются на форуме, как говорится, "бескорыстно"?

Да наверное ничем,... просто я - мудаг... злой и ваще. ...
А так - просто судя по Вашим постам (не только этому) сладывается впечатление, что делается попытка непрофессиональными (в плане программировани баз данных) руками решить вполне-таки промышленную задачу. Причём постановка несколько кривая по сути. Отсюда варианты:
1) Кто-то сэкономил бабло на покупке SCADA/Биллинговой - системы
2) Кто-то хочет облегчить себе жизнь и повесил (на Вас) разработку учётной системы (а, типа, есть человек - пусть работает)
3) Кто-то пытается разработать что-то чтобы потом это раздавать/продавать
4) ?...
- и это предполагается решить за счёт коллективного разума форума. А разум против... Студентов тут так вообще иной раз посылают нах,- коли попадутся под горячую руку ... Интересно, они, поди и на "преподов" своих тут нарывались :) ...
В общем, если вам здесь будет интересно и Вы задержитесь тут месяца на три-четыре (и отнюдь не в ПэТэ), то всё поймёте... Удачи!
15 янв 12, 01:50    [11906060]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
aleks2
Guest
SIMPLicity_
Sasha8111
Единственное, что ходел бы напоследок спросить, что бы больше не наступать на одни и те же грабли, чем данная тема (задача) отличается от тех, которые вполне активно обсуждаются на форуме, как говорится, "бескорыстно"?

Да наверное ничем,... просто я - мудаг... злой и ваще. ...


Да ладно, чо уж не просветить неофита?

Все биллинговые системы устроены одинаково.

1. Вся исходная информация с внешних устройств пишется в базу "as is", т.е. БЕЗ КАКИХ-ЛИБО ИЗМЕНЕНИЙ. Шоб не тормозить.
2. Это хранится там вечно или уничтожается по истечении определенного времени хранения.
3. В этом смысле ваша R_LOG - правильно сделана.
4. Все остальные "обработанные данные для отображения" насчитываются в отдельных потоках, в фоновом режиме по мере поступления исходной информации.
5. И хранятся в отдельных накопительных таблицах (регистрах).
6. Запрос на "вывод данных" НИЧЕГО НЕ СЧИТАЕТ (это идеал), он просто выводит уже насчитанные данные из накопительных таблиц (регистров).
7. Таким образом, задача разработчика биллинговой системы - спроектировать "данные для отображения" и обеспечить их рассчет.
15 янв 12, 10:20    [11906288]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
Sasha8111
Member

Откуда:
Сообщений: 33
автор
1) Кто-то сэкономил бабло на покупке SCADA/Биллинговой - системы
2) Кто-то хочет облегчить себе жизнь и повесил (на Вас) разработку учётной системы (а, типа, есть человек - пусть работает)
3) Кто-то пытается разработать что-то чтобы потом это раздавать/продавать
4) ?...


к сожалению или к счастью, энергоучет в моей системе автоматики и диспетчеризации занимает далеко не основное место.

Если сравнить весь объем по программированию:
контроллеры управления инж. системами, HMI для АРМ оператора и т.д., то доля энергоучета где-то 5% от всей разработки, а по точкам и того меньше - 100 точек энергоучета к 10000 точкам всей системы. Думаю на данном объекте он объективно не тянет на серъезную билинговую систему, поэтому и пришлось непрофессиональными руками закрывать данную задачу.
16 янв 12, 00:21    [11908321]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
Sasha8111
Member

Откуда:
Сообщений: 33
И все таки, сильного из любопытства ради.
возможно ли в одном запросе объеденить всякую там логику, например
первый вариант запроса



 SELECT  
R_LOG._Date,        
R_Energy.Energy_DESCR,
R_ZONE.ZONE_DESCR,    /*!*/
R_Energy.Unit
         
FROM    
R_LOG, 
R_Energy, 
R_ZONE  /*!*/


GROUP BY 
R_LOG._Date,  
R_Energy.Energy_DESCR,                            
R_ZONE.ZONE_DESCR, /*!*/                                    
R_Energy.Unit 




Если строки, отмеченные /*!*/ закоментировать ( /*R_ZONE.ZONE_DESCR*/, /*R_ZONE*/, /*R_ZONE.ZONE_DESCR*/), то получится второй вариант запроса, который можно сохранить в отдельный файл и использовать, но хотелось бы у Вас спросить, а можно ли два запроса объеденить в один, через какую то логику - может какие то дополнительные операторы SQL.
Пока все что у меня вышло - это реализовать два запроса в отдельные процедуры (в одной - целый запрос, в другой с закоментированными /*!*/ или поудалять их вообще)
и вызывать эти два запроса из третей процедуры через IF, ELSE.


Спасибо
17 янв 12, 15:01    [11918244]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
можно....
... использовав, например, WHERE...
18 янв 12, 00:47    [11921835]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
Sasha8111
Member

Откуда:
Сообщений: 33
автор
использовав, например, WHERE


Не совсем понятно,
в WHERE можно выбирать значения в строках тех столбцов, которые указаны в SELECT, но отбрасывать/добавлять целые столбцы ?

Запрос 1
SELECT  
R_LOG._Date,        
R_Energy.Energy_DESCR,
R_ZONE.ZONE_DESCR    /*!*/     
FROM    
R_LOG, 
R_Energy, 
R_ZONE  /*!*/
GROUP BY 
R_LOG._Date,  
R_Energy.Energy_DESCR,                            
R_ZONE.ZONE_DESCR /*!*/ 

даст, например, таблицу 1 (см. приложенный файл)

Запрос 2

SELECT
R_LOG._Date,        
R_Energy.Energy_DESCR
/*R_ZONE.ZONE_DESCR*/		/*!*/
FROM
R_LOG,
R_Energy
/*R_ZONE*/				/*!*/
GROUP BY
R_LOG._Date,
R_Energy.Energy_DESCR                            
/*R_ZONE.ZONE_DESCR*/		/*!*/ 

даст таблицу 2 (см. приложенный файл).

Применяя WHERE возможно будет наложить на таблицу 1 некоторые условия для SELECT столбцов, но не "выбросить" весь столбец ZONE_DESCR

К сообщению приложен файл. Размер - 6Kb
18 янв 12, 14:57    [11925774]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
select Таблица1.Поле1, Таблица1.Поле2, Таблица2.Поле1, Таблица2.Поле4
from Таблица1, Таблица2
where Таблица1.Поле = Таблица2.Поле1
and Таблица1.Поле5 = Таблица2.Поле4


или тоже самое -правое/левое соединение таблиц .... но как
написано выше - проще...
======= Если я правильно понял суть вопроса... ========== (((@))) ====
18 янв 12, 18:39    [11928347]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Хотя, я нверное, не совсем понял суть вопроса... Можно сделать хранимую процедуру, которая будет в зависимости от разных запросов (опций) возвращать разные результаты... Но, кажется, процедура с возвратом таблицы с переменным количеством столбцов - это не хорошо... ИМБО, опять-таки....
18 янв 12, 18:44    [11928369]     Ответить | Цитировать Сообщить модератору
 Re: Энергоучет SQL  [new]
мимо проходящий ))
Guest
тут надо проектироваться сначала, а не гадать.
19 янв 12, 08:13    [11929841]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить