SQL. Консолидация значений строк таблицы в одну
Есть таблица:
| id | fdate | s_1 | s_2 | s_3 | s_4 |
|---|---|---|---|---|---|
| 1 | 2023-01-01 | Да | |||
| 2 | 2023-01-01 | Нет | |||
| 3 | 2023-01-01 | Да | |||
| 4 | 2023-01-01 | Да | |||
| 5 | 2023-01-01 | Да | |||
| 6 | 2023-01-01 | Да | |||
| 7 | 2023-01-01 | Нет | |||
| 8 | 2023-01-01 | Да |
Нужно в запросе вывести:
| id | fdate | s_1 | s_2 | s_3 | s_4 |
|---|---|---|---|---|---|
| 1 | 2023-01-01 | Да | Нет | Да | Да |
| 5 | 2023-01-01 | Да | Да | Нет | Да |
Как такое можно реализовать без применения хранимых процедур?
Ответы (2 шт):
Автор решения: rotabor
→ Ссылка
Если принять, что дата в строках 5-8 должна быть другая, то решение может быть таким (Table_4 просто случайное название для исходной таблицы):
SELECT Table4.fdate, First(Table4.s_1) AS FirstOfs_1, First(Table4_1.s_2) AS FirstOfs_2, First(Table4_2.s_3) AS FirstOfs_3, First(Table4_3.s_4) AS FirstOfs_4
FROM Table4 AS Table4_3 INNER JOIN (Table4 AS Table4_2 INNER JOIN (Table4 AS Table4_1 INNER JOIN Table4 ON Table4_1.fdate = Table4.fdate) ON Table4_2.fdate = Table4.fdate) ON Table4_3.fdate = Table4.fdate
WHERE (((Table4.s_1) Is Not Null) AND ((Table4_1.s_2) Is Not Null) AND ((Table4_2.s_3) Is Not Null) AND ((Table4_3.s_4) Is Not Null))
GROUP BY Table4.fdate;
Для произвольного количества столбцов только могу предложить генерировать запрос программно. Можно решить эту задачу с помощью другого запроса, но там тоже требуется явно задавать столбцы. Я не знаю способа работы с произвольным количеством столбцов. Может, специалисты ещё подскажут.
Автор решения: CrazyElf
→ Ссылка
Мне кажется что-то такое вполне должно сработать, но я не настоящий SQL-щик:
SELECT (CAST((id-1)/4 as INT)*4 + 1) as id, MAX(fdate), MAX(s_1, s_2, s_3, s_4)
GROUP BY 1