|
|
|
Запрос на сервер Microsoft SQL Server
|
|||
|---|---|---|---|
|
#18+
Пожалуйста помогите, кто чем может. Стоит такая задача. Сделать запрос по типам оборудования(поле device таблицы a_data_general) для всех АТС(поле ats таблицы a_data_general) за месяц исключая выходные( в эти дни съем данных может не просходить) либо 2-й вариант запроса исключая дни, когда число записей по типам оборудования равно нулю(съем данных не происходил) для следующей таблицы: Тип оборудования АТС-11 АТС-01 АТС-21 .... АИ-АВ исх Ср. зн. Ср. зн. Ср. зн. АИ-АВ вх ................................................ РИА ЭАРБ 1-ГИ ....... где Ср. зн. - Среднее значение -число записей за месяц исключая выходные, либо 2-й вариант запроса исключая дни, когда число записей по типам оборудования равно нулю раделить на число дней, подсчета числа записей, т. е. Sum(Count(*))/'22' (пусть для примера учитывается 22 рабочих дня в месяц).Число записей подсчитывается как число записей по типу оборудования делить на число маркеров для данного типа оборудования, т.е. Count(*)/mar. Составляю запрос для 1-го варианта(мне кажется он проще), отрабатывая запрос пока для 3 АТС и определенного интервала дней. Если взять запрос: select a_data_general.device , (case when (a_data_general.ats='11')then (Count(a_data_general.ats)/a_por.mar) end) R0, (case when (a_data_general.ats='01')then (Count(a_data_general.ats)/a_por.mar) end) R1, (case when (a_data_general.ats='21')then (Count(a_data_general.ats)/a_por.mar) end) R2 from a_data_general,a_por where (a_data_general.device=a_por.device) and (a_data_general.ats=a_por.ats) and (dt >= '20020902 00:00:00') and (dt <= '20020914 23:59:59') and datepart(hh, dt) >= 9 and datepart(hh, dt) < 18 group by a_data_general.ats,a_data_general.device,a_por.mar , тогда результат будет такой Тип оборудования АТС-11 АТС-01 АТС-21 АИ-АВ вх 2 НЕТ 2 2-ГИ 1 АИ-АВ исх 5 НЕТ 1 ЭВРД 2 1-ГИ 42 3-ГИ 9 АИ-АВ вх 62 АИ-АВ исх 8 НЕТ 329 СД 263 .................................................................................... , т. е. считает правильно. Когда суммируешь по типам оборудования(таблица a_por содержит маркеры и пороговое значение с которым будет сравниваться сумма) запросом: select Tab.device, Sum(R0) , Sum(R1), Sum(R2) from a_por,( select a_data_general.device , (case when (a_data_general.ats='11')then (Count(a_data_general.ats)/a_por.mar) end) R0, (case when (a_data_general.ats='01')then (Count(a_data_general.ats)/a_por.mar) end) R1, (case when (a_data_general.ats='21')then (Count(a_data_general.ats)/a_por.mar) end) R2 from a_data_general,a_por where (a_data_general.device=a_por.device) and (a_data_general.ats=a_por.ats) and (dt >= '20020903 00:00:00') and (dt <= '20020914 23:59:59') and datepart(hh, dt) >= 9 and datepart(hh, dt) < 18 group by a_data_general.ats,a_data_general.device,a_por.mar )Tab where (Tab.device=a_por.device) group by Tab.device , тогда результат будет такой Тип оборудования АТС-11 АТС-01 АТС-21 1-ГИ 42 2-ГИ 2 3-ГИ 9 АИ-АВ вх 15 6 186 АИ-АВ исх 8 НЕТ 3 6 987 СД 263 ЭВРД 4 .................................................................................... , т. е. суммирует по типам оборудования(строкам) неправильно. Что делать? Может быть где-то ошибка?Может быть как-то по другому составить запрос?Может быть запрос по 2-варианту легче? Как он будет выглядеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2002, 07:25:54 |
|
||
|
Запрос на сервер Microsoft SQL Server
|
|||
|---|---|---|---|
|
#18+
Это перекрестную таблицу надо? Не мучтесь, отберите из таблицы требуемый дипазон, а перекрестную сделайте на клиенте. Точнее ответить помогла бы структура баз и принцип заполнения. Я так понял Табла 1 AtS char,Device char Табла 2 AtS char,Device char,mar int, dt DateTime Правда, при такой структуре табла 1 в запросе не нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2002, 23:54:28 |
|
||
|
Запрос на сервер Microsoft SQL Server
|
|||
|---|---|---|---|
|
#18+
По поводу структур таблиц. Таблица 1: ats varchar(50) dt datetime(8) device varchar(10) uak_num smallint(2) memo varchar(1) R1 char(1) R2 char(1) R3 char(1) ................................ R15 char(1) R16 char(1) D_STATIV char(3) D_IN char(3) Status char(2) эта таблица содержит записи по типам оборудования за определенное время с определенными параметрами, количество этих записей необходимо подсчитать. Пример: 11 21 13.09.2002 14:09:15 12.09.2002 10:07:36 АИ-АБ вх СД 1 1 а b 5 1 5 7 5 3 ........................................... 5 x 5 x 0 17 5 11 Ок Ok и т. д. Структура таблицы №2: ats char(10) device char(10) porog int(4) mar int(4) type char(10) эта таблица содержит пороговые значения, число маркеров, тип АТС для каждого типа оборудования АТС. Пример: 11 21 21 АИ-АБ вх АИ-АБ вх СД 1 2 1 1 2 3 1 1 1 и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2002, 08:07:55 |
|
||
|
Запрос на сервер Microsoft SQL Server
|
|||
|---|---|---|---|
|
#18+
У вас первый запрос содержит группировку по 3-м полям group by a_data_general. ats, a_data_general. device,a_por.mar а второй только по одому group by Tab.device Поэтому они должны и выдают разные результаты. Мой вам совет - почитайте в BOL про GROUP BY ... WITH ROLLUP и GROUPING. С их помощью можно получить результаты ничем не "хуже" чем у перекрестных отчетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2002, 19:04:59 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32056178&tid=1819730]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
72ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 370ms |

| 0 / 0 |
