powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на сервер Microsoft SQL Server
4 сообщений из 4, страница 1 из 1
Запрос на сервер Microsoft SQL Server
    #32056178
rom900
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуйста помогите, кто чем может. Стоит такая задача.
Сделать запрос по типам оборудования(поле 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-варианту легче? Как он будет выглядеть?
...
Рейтинг: 0 / 0
Запрос на сервер Microsoft SQL Server
    #32056567
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это перекрестную таблицу надо?

Не мучтесь, отберите из таблицы требуемый дипазон, а перекрестную сделайте на клиенте.

Точнее ответить помогла бы структура баз и принцип заполнения.

Я так понял
Табла 1

AtS char,Device char

Табла 2
AtS char,Device char,mar int, dt DateTime

Правда, при такой структуре табла 1 в запросе не нужна.
...
Рейтинг: 0 / 0
Запрос на сервер Microsoft SQL Server
    #32056588
rom900
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу структур таблиц.
Таблица 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
и т.д.
...
Рейтинг: 0 / 0
Запрос на сервер Microsoft SQL Server
    #32056874
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас первый запрос содержит группировку по 3-м полям
group by a_data_general. ats, a_data_general. device,a_por.mar

а второй только по одому
group by Tab.device

Поэтому они должны и выдают разные результаты.

Мой вам совет - почитайте в BOL про GROUP BY ... WITH ROLLUP и GROUPING. С их помощью можно получить результаты ничем не "хуже" чем у перекрестных отчетов.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на сервер Microsoft SQL Server
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]