У меня SQL-запрос (MSSQLSERVER), где я добавляю столбцы в набор результатов с помощью подвыборов:
SELECT P.name,
(select count(*) from cars C where C.type = 'sports') AS sportscars,
(select count(*) from cars C where C.type = 'family') AS familycars,
(select count(*) from cars C where C.type = 'business') AS businesscars
FROM people P
WHERE P.id = 1;
Вышеприведенный запрос только из тестовой настройки, что немного глупо, но, как мне кажется, он служит достаточно хорошим примером. На самом деле запрос, над которым я работаю, охватывает несколько сложных таблиц, которые только отвлекают от рассматриваемой проблемы.
В приведенном выше примере каждая запись в таблице "people" также имеет три дополнительных столбца: "wantSportscar", "wantFamilycar" и "wantBusinesscar". Теперь я хочу сделать выборку для каждого дополнительного столбца только в том случае, если соответствующему полю «хочет .....» в таблице сотрудников установлено значение «истина». Другими словами, я хочу сделать первый подвыбор, только если для P.wantsSportscar задано значение true для этого конкретного человека. Второй и третий подпункты должны работать аналогичным образом.
Таким образом, этот запрос должен работать так, чтобы он отображал имя конкретного человека и количество моделей, доступных для типов автомобилей, которые он хочет иметь. Возможно, стоит отметить, что мой окончательный набор результатов всегда будет содержать только одну запись, а именно запись одного конкретного пользователя.
Важно, что если человек не интересуется определенным типом автомобилей, столбец для этого типа не будет включен в окончательный набор результатов. Пример, чтобы убедиться, что это ясно:
Если человек А хочет спортивный автомобиль и семейный автомобиль, результат будет включать столбцы «имя», «спортивные автомобили» и «семейные автомобили».
Если человек B хочет бизнес-кар, результат будет включать столбцы «имя» и «бизнес-кар».
Я пытался использовать различные комбинации с операторами IF, CASE и EXISTS, но до сих пор не смог получить синтаксически правильное решение. Кто-нибудь знает, возможно ли это вообще? Обратите внимание, что запрос будет сохранен в хранимой процедуре.