Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Форматирование с помощью 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо