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

Откуда:
Сообщений: 17
Товарищи, помогите с реализацией запроса для отображения расписания. Или в какую сторону гуглить.
построитель отчетов fastreport решал такую задачу с помощью объекта матрица, а как выглядит запрос понять не могу
Есть связанные таблицы:
[Событие] - в таблице поля со внешними ключами: пациент, врач
[Время] (Здесь хранятся записи со временем с интервалом в 5 минут от 00:00 до 23:55) - 288 строк
[ВремяСобытие] - связующая таблица с внешними ключами на таблицы Время и Событие
[Врач] - id и фио
[Клиент] - id и фио
Требуется получить на выходе таблицу такого вида
Врач Иванов Петров
09:00 null null
09:05 null null
09:10 клиент1 null
09:15 клиент1 null
09:20 клиент1 клиент2
09:25 null клиент2
09:30 null null

Количество врачей - непостоянное, пациентов соответственно тоже
21 ноя 16, 17:06    [19917368]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
лучше сделайте это в Exсel с помощью Сводной таблицы
21 ноя 16, 17:08    [19917382]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
matyukhin-ss,

шахматки надо рисовать построителем отчетов. Reporting Services по-моему умеет такое.
21 ноя 16, 17:58    [19917709]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
matyukhin-ss
Member

Откуда:
Сообщений: 17
Владислав Колосов,
а запрос такой не получится создать, чтобы я его в drawgrid прикрутил и раскрашивал непустые значения?
21 ноя 16, 18:15    [19917787]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
buven
Member

Откуда:
Сообщений: 792
matyukhin-ss,

Скачайте пример отсюда
Разверните у себя и посмотрите реализацию. Там станет понятно, что запрос к базе мудреный не нужно писать, а нужно ключенвать несколько простых на клиенте.
21 ноя 16, 18:32    [19917875]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
matyukhin-ss
Member

Откуда:
Сообщений: 17
buven,

вы не поняли, мне в Delphi приложение нужно выводить в drawgrid
может как вариант таблицу на 3 части делить и 3 запроса сводить: шапка с фамилиями, 1-й столбец со внеменем и собственно само пересечение?
22 ноя 16, 08:14    [19918859]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
matyukhin-ss
Member

Откуда:
Сообщений: 17
Коллеги, решил вопрос следующим способом.
делаю первый запрос, в котором получаю записи вида idВрач и фиоВрача из таблиц связанных с таблицей Событие

далее в приложении (наверно лучше xml-ку создавать) делаю
переменную (назовем, к примеру str2) и в ней собираю строку в цикле
for i:=0 to data_frm.qPatients.recordcount - 1 do
  begin
    str2 := str2 + 'max(case when E.idDolgPerson = '+data_frm.qPatients.FieldByName('idВрач').AsString+' then PersonPatient.f else null end) as '+data_frm.qPatients.FieldByName('ФамилияВрач').AsString+',';
    data_frm.qPatients.next;
  end;


и третий запрос
получается
select
str2,
t.name
from [rasp].[Event] E
join rasp.TimeEvent TE on TE.idEvent = E.idEvent
join dbo.DolgPerson DP on DP.idDolgPerson = E.idDolgPerson
join dbo.Person P on P.idPerson = DP.idPerson
right join rasp.Time T on T.idTime = TE.idTime
left join dbo.Patient Patient on Patient.idPatient = E.idPatient
left join dbo.Person PersonPatient on PersonPatient.idPerson = Patient.idPerson
group by t.name 


Отсюда у меня вопрос:
насколько это костыльный метод, насколько непродуктивный и какие грабли из этого могут выйти?
22 ноя 16, 08:57    [19918939]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
matyukhin-ss,

Pivot - unpivot
Ну и без динамики не обойтись.

Ну или лучше выкачивайте как и положено нормальную плоскую таблицу. Потом на клиенте выгребайте из нее уникальных врачей, уникальные интервалы, и пересекайте.
Или возьмите компонент, который сам это умеет делать. Их должно быть море
22 ноя 16, 08:58    [19918944]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
aleks2
Guest
Фсе равно, выкидывать. Не парься.

ЗЫ. MS SQL перемалывает даные быстрее твоего кривого кода.
22 ноя 16, 09:02    [19918951]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
matyukhin-ss,

У вас прям так str2 подставляется в запрос? Без там плюсиков?
Ну вы и сделали динамический скл, только запрос собрали на клиенте.
22 ноя 16, 09:05    [19918959]     Ответить | Цитировать Сообщить модератору
 Re: запрос - матрица  [new]
matyukhin-ss
Member

Откуда:
Сообщений: 17
Mike_za,

ну конечно с плюсиками)
если вы заметили, то и имена полей и таблиц в последнем запросе впихнул уже реальные, а не "idВрач", "Событие" и т.д)))
ну запрос пока что работает, вывожу все-таки в DBGrid, расширяю, делаю привязку к календарю и прочее
22 ноя 16, 09:25    [19919001]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить