Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.023 c
14-51526
ShaPka
2003-09-26 23:27
2003.10.16
Удаление из каталога все, что можно удалить


11-51158
microlab
2003-02-01 21:59
2003.10.16
Меню как много в этом слове...


6-51387
AlexLP
2003-08-19 10:55
2003.10.16
Автоподключение и автоотключение к Интернет.


6-51392
ККВ
2003-08-22 08:15
2003.10.16
Indy и ftp


1-51179
Армянское радио
2003-10-05 07:00
2003.10.16
как разбить строку на лексемы




   Наверх