![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Форматирование с помощью SQL
Alex_x © (2003-09-26 13:05:00)
есть таблица типа ID, DAY, DATA в поле DAY пишется номер дня месяца 1,2,3..., а в DATA какаято запись за этот день. Надо в результате получить даные в формате: заголовоки дни месяца тоесть 1,2,3..31, и под ними записи за эти дни, тоесть "Развернуть" её типа календаря. Можна с помощю SQL подобное организовать?. Я делал в датасете 31 вичисляемое поле (для каждого дня своя колонка) и из базы вибирал записи за этот день, но это слишком долго
Rem (2003-09-26 17:59:00) [1]
Запрос, создающий псевдо-СТОЛБЦЫ на основании СТРОК из какой-либо таблицы. Удобно использовать при создании мудреных "простыней".
TANSFORM
[поле2], [поле2], ... [] // агрегативные функции и пр...
(SELECT...) // запрос из БД
PIVOT
[поле, по которому будут сформированы псевдо-столбцы]
Sandman25 (2003-09-26 15:40:00) [2]
select
(select data from table where id = 1 and month = 9 and year = 2003),
(select data from table where id = 2 and month = 9 and year = 2003),
...
(select data from table where id = 31 and month = 9 and year = 2003)
from любая_таблица_в_которой_ровно_1_запись
Но вообще-то послушайте [8] kaif © (26.09.03 14:10)
Действительно было бы гораздо лучше делать это на клиенте или в хранимой процедуре.
И не забудьте сделать составной уникальный индекс (id, month, year).
kaif (2003-09-26 14:10:00) [3]
Все же я бы делал это на клиенте. Но как-то оптимальнее. Взял бы очень быстрый компонент таблиц в памяти типа TKbmMemTable и раскидал бы результат простого "вертикального" запроса по колонкам этой таблицы. Это можно сделать за доли секунды даже на наборе в несколько сот тысяч строк.
А делать 31 LEFT OUTER JOIN будет медленно и глючно, особенно если там еще используются SUM() и возможны NULL значения.
И вообще SQL должен поставлять данные, а не форматировать их, если это снижает скорость.
Но это мое личное мнение.
Alex_x (2003-09-26 13:55:00) [4]
эсть ещё поля THE_MONTH, THE_YEAR. Но счас генерируется датасет большого обёма. в нём дублируютя записи много раз и я немогу устанавливая условия отбора за месяц, год их отсеять всёравно невиходит то что надо
select T1.WORK_TIME, T2.WORK_TIME, T3.WORK_TIME
from T_DATA T, T_DATA T1, T_DATA T2, T_DATA T3
where T1.THE_DAY = 1 and T2.THE_DAY = 2 and T3.THE_DAY = 3
AND T.THE_MONTH=9 AND T.THE_YEAR=2003 T.TABEL_ID=2
Sandman25 (2003-09-26 13:44:00) [5]
То есть данные там всегда только за 1 месяц?
Или есть еще поля с месяцем и годом?
Сохранять можно будет, но только с помощью CashedUpdates = True и объекта UpdateSQL.
Alex_x (2003-09-26 13:38:00) [6]
а можна будет подключив этот "развёрнутый" датасет к гриду его редактировать в таком виде, и сохранять изменения в таблице
Alex_x (2003-09-26 13:34:00) [7]
id уникальное поле, но первий вариан не прошол. гдето на D01= пишет token unknow может там есть ошибка, я такую конструкциюю ещё никогда не использовал.
Sandman25 (2003-09-26 13:23:00) [8]
Alex_x © (26.09.03 13:05)
Id - уникальное поле?
Если да, то см. [2]
Если нет, то см. [1]
Sandman25 (2003-09-26 13:15:00) [9]
select t1.data, t2.data, ... t31.data
from t t1, t t2, ... t t31
where t1.day = 1 and t2.day = 2 and ... t31.day = 31
Если за какую-то дату может не быть данных, надо будет использовать Outer
ZrenBy (2003-09-26 13:12:00) [10]
select
ID,
D01 = sum(case when Day= 1 then DATA else 0 end),
...
D31 = sum(case when Day=31 then DATA else 0 end)
from ...
group by ID