powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Улучшить запрос
10 сообщений из 10, страница 1 из 1
Улучшить запрос
    #32037068
Anpetro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть большая таблица , которая содержит информацию о посещении населения поликлиники.

одно посещение=одна запись таблицы

Запись содержит поля: ...,ID_Terr,ID_Spec,...
где
ID_Terr - номер территории (проживания пациента),
ID_Spec - номер специалиста (обследовавшего).

Необходимо поднять статистику - количество посещений по территориям в разрезе специалистов.

Вниманее ВОПРОС :-)

Можно ли придумать что-нибудь по-лучше?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
ID_Terr,
count(case ID_Spec when  1  then ID_Spec else null end),
count(case ID_Spec when  2  then ID_Spec else null end),
count(case ID_Spec when  3  then ID_Spec else null end),
count(case ID_Spec when  4  then ID_Spec else null end),
count(case ID_Spec when  5  then ID_Spec else null end)
 from BIGTABLE
group by ID_Terr


Плюс - все работает
Минус - громоздкий код, т.к. специалистов не 5 а 50

Заранее спасибо.
...
Рейтинг: 0 / 0
Улучшить запрос
    #32037081
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, для таких вещей лучше пользоваться приложениями,для этого предназначенными,т.е. средствами,направленными на создание отчетов.
Если ничего под рукой нет, самое простое -
Аксесс-Pivot Table (перекрестный запрос), или
ексель->Сводная таблица
...
Рейтинг: 0 / 0
Улучшить запрос
    #32037128
Anpetro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИМХО, для таких вещей лучше пользоваться приложениями,для этого предназначенными,т.е. средствами,направленными на создание отчетов.
Если ничего под рукой нет, самое простое -
Аксесс-Pivot Table (перекрестный запрос), или
ексель->Сводная таблица


Именно!
Для формирования отчетов используется Report Builder Pro
(Компонента в Delphi), а для этого необходимо создавать таблицу где бы то нибыло; лучше всего ее формировать на сервере посредством SQL запроса (или я неправ?).

Отмечу, что по таблице с количеством записей 500000 предложенный мной запрос выполняется за 13 секунд;
Access возится полторы минуты.

Вопрос остается открытым.
...
Рейтинг: 0 / 0
Улучшить запрос
    #32037133
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, но для билдеров Pivot-отчетов данные даются
не в конечном виде, а в виде набора записей,
содержимое одного (или нескольких) поля из которых в отчете станет названием столбца
...
Рейтинг: 0 / 0
Улучшить запрос
    #32037144
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно так тоже подойдет? Надо только будет по другому обрабатывать полученный Recordset
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT
ID_Terr,
ID_Spec
count(ID_Spec)
from BIGTABLE
group by ID_Terr, ID_Spec
...
Рейтинг: 0 / 0
Улучшить запрос
    #32037155
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так

Код: plaintext
1.
2.
3.
4.
5.
6.
select case when grouping(ID_Terr )= 1  then 'x- Total -x' else ID_Terr  end as ID_Terr ,
case when grouping(ID_Spec ) =  1  then 'x- ' +CAST(ID_Terr as varchar( 10 ))+ ' total -x' else ID_Spec  end as ID_Spec ,
 count(*)
from bigtable
group by ID_Terr , ID_Spec  with rollup
order by ID_Terr , ID_Spec 


P.S.
Я исходил из того, что ID_Terr у вас типа integer
...
Рейтинг: 0 / 0
Улучшить запрос
    #32037289
SM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая штука - RAC (Replace of Access Crosstab) - делает тоже самое, что и перекрестные запросы в Access только на сервере + намного круче и навороченее. 200 кб TSQL текста.
...
Рейтинг: 0 / 0
Улучшить запрос
    #32037290
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И... где линк ?
...
Рейтинг: 0 / 0
Улучшить запрос
    #32037349
Anpetro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем БОЛЬШОЕ спасибо!

Я на SQL-е пишу полгода,
поэтому узнал много нового и полезного.

PS (for Glory ) Все работает, но вместо 'x-Total-x' пришлось написать численное значение.
...
Рейтинг: 0 / 0
Улучшить запрос
    #32037365
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, моя ошибка. CASE должен возвращать значения одного типа, поэтому можно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select case when grouping(ID_Terr )= 1  then 'x- Total -x' else CAST(ID_Terr as varchar( 10 ))  end as ID_Terr ,
case when grouping(ID_Spec ) =  1  then 'x- ' +CAST(ID_Terr as varchar( 10 ))+ ' total -x' else CAST(ID_Spec  as varchar( 10 )) end as ID_Spec ,
 count(*)
from bigtable
group by ID_Terr , ID_Spec  with rollup
order by ID_Terr , ID_Spec 

...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Улучшить запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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