SQL извлечь названия неполных столбцов

Рейтинг: 0Ответов: 1Опубликовано: 15.07.2023

Возникло интересное задание. В таблице может быть неопределенное количество столбцов. Каждый столбец соответствует одной дате, а так же есть всего 4 ячейки. Нужно вывести названия всех незаполненных до конца столбцов. БД - PostgreSQL, если вдруг играет роль. Буду рад услышать ваши варианты!

введите сюда описание изображения

UPD: Я создаю чат-бота, в котором люди могут записываться на сеансы у одного врача. У этого врача не постоянный график, т.е. нет четкого 2/2 или 3/3. Соответственно для записи пользователю нужно выбрать дату, в которую он придет. Я придумал такую схему: врач пишет чат-боту дни, в которые он может принять клиентов, после чего создается запрос, в котором добавляются новые столбцы в БД, в названии которых заключена дата. Ну и каждая строка рассчитана на одного человека, т.е. запись.

Ответы

▲ 0Принят

Я бы сделал так:

  1. Врач пишет в бот дату и кол-во людей, которые он может принять в этот день. Это записывается в таблицу Doctor(OpenDate,NumberOfPeople).
  2. Для регистрации пациентов используется другая таблица Patients(AppointmentDate,PatientName).
  3. Пациенты записываются на даты:
SELECT OpenDate
FROM (
    SELECT T2.OpenDate, Count(T1.PatientName) AS COP,MIN(T2.NumberOfPeople) AS NOP
    FROM Doctor AS T2 LEFT JOIN Patients AS T1 ON T2.OpenDate = T1.AppointmentDate
    GROUP BY T2.OpenDate
)
WHERE COP<NOP

T1 и T2 - это псевдонимы для таблиц или имена для результатов запросов. T1 - псевдоним для таблицы Patients, T2 - для для таблицы Doctor. Псевдонимы используются вместо имён таблиц либо как имена запросов.

Псевдонимы для таблиц необязательны, но используются для сокращения текста запроса, а псевдонимы для результатов запросов нужны чтобы просто иметь возможность к ним как-то обращаться.

Почитайте литературу по SQL.

Как работает этот запрос?

Подзапрос

SELECT T2.OpenDate, Count(T1.PatientName) AS COP,MIN(T2.NumberOfPeople) AS NOP
FROM Doctor AS T2 LEFT JOIN Patients AS T1 ON T2.OpenDate = T1.AppointmentDate
GROUP BY T2.OpenDate

объединяет таблицы по дате, причём из таблицы Doctor выбираются все имеющиеся даты и по ним происходит группировка результатов. Для каждой даты подсчитывается количество записавшихся пациентов и выводится кол-во пациентов, которых готов принять доктор.

А верхний запрос по результатам подзапроса выводит даты, где кол-во записавшихся пациентов меньше, чем кол-во пациентов, которых готов принять доктор.