Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];

Вниз

Форматирование с помощью 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
14-51510
Wild
2003-09-27 12:32
2003.10.16
KDevelop (Не могу разобраться)


14-51521
Knight
2003-09-26 23:56
2003.10.16
Где найти материалы по экологии?


1-51164
Shuhkoman
2003-10-05 14:17
2003.10.16
Help! Языковая понель :)


1-51318
WondeRu
2003-10-06 09:29
2003.10.16
Корреляционные функции


3-51070
uu
2003-09-26 17:50
2003.10.16
Picklist





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский