Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

Форматирование с помощью SQL   Найти похожие ветки 

 
Alex_x ©   (2003-09-26 13:05) [0]

есть таблица типа ID, DAY, DATA в поле DAY пишется номер дня месяца 1,2,3..., а в DATA какаято запись за этот день. Надо в результате получить даные в формате: заголовоки дни месяца тоесть 1,2,3..31, и под ними записи за эти дни, тоесть "Развернуть" её типа календаря. Можна с помощю SQL подобное организовать?. Я делал в датасете 31 вичисляемое поле (для каждого дня своя колонка) и из базы вибирал записи за этот день, но это слишком долго


 
ZrenBy ©   (2003-09-26 13:12) [1]

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


 
Sandman25 ©   (2003-09-26 13:15) [2]

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


 
Sandman25 ©   (2003-09-26 13:23) [3]

Alex_x © (26.09.03 13:05)

Id - уникальное поле?
Если да, то см. [2]
Если нет, то см. [1]


 
Alex_x ©   (2003-09-26 13:34) [4]

id уникальное поле, но первий вариан не прошол. гдето на D01= пишет token unknow может там есть ошибка, я такую конструкциюю ещё никогда не использовал.


 
Alex_x ©   (2003-09-26 13:38) [5]

а можна будет подключив этот "развёрнутый" датасет к гриду его редактировать в таком виде, и сохранять изменения в таблице


 
Sandman25 ©   (2003-09-26 13:44) [6]

То есть данные там всегда только за 1 месяц?
Или есть еще поля с месяцем и годом?

Сохранять можно будет, но только с помощью CashedUpdates = True и объекта UpdateSQL.


 
Alex_x ©   (2003-09-26 13:55) [7]

эсть ещё поля 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


 
kaif ©   (2003-09-26 14:10) [8]

Все же я бы делал это на клиенте. Но как-то оптимальнее. Взял бы очень быстрый компонент таблиц в памяти типа TKbmMemTable и раскидал бы результат простого "вертикального" запроса по колонкам этой таблицы. Это можно сделать за доли секунды даже на наборе в несколько сот тысяч строк.
А делать 31 LEFT OUTER JOIN будет медленно и глючно, особенно если там еще используются SUM() и возможны NULL значения.
И вообще SQL должен поставлять данные, а не форматировать их, если это снижает скорость.
Но это мое личное мнение.


 
Sandman25 ©   (2003-09-26 15:40) [9]

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).


 
Rem ©   (2003-09-26 17:59) [10]

Запрос, создающий псевдо-СТОЛБЦЫ на основании СТРОК из какой-либо таблицы. Удобно использовать при создании мудреных "простыней".

TANSFORM
[поле2], [поле2], ... [] // агрегативные функции и пр...
(SELECT...) // запрос из БД
PIVOT
[поле, по которому будут сформированы псевдо-столбцы]



Страницы: 1 вся ветка

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
14-51509
ИМХО
2003-09-26 23:55
2003.10.16
На сотовый!


3-51109
vil
2003-09-25 13:14
2003.10.16
Параметры хранимой процедуры


1-51237
webpauk
2003-10-03 14:36
2003.10.16
Отрисовка ClientRect


1-51233
ded_mazai
2003-10-03 16:54
2003.10.16
ini-файлы


1-51180
romeo
2003-10-04 23:05
2003.10.16
Не происходит событие OnMouseWheel