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

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

Запрос (case)


rel_ ©   (2003-10-28 08:31:00) 

Мастера, помогите с запросом.

Пишу следующее

select
(CASE
WHEN field_a in (34,54) then "01 - 34,54"
WHEN field_a in (44,45) then "02 - 44,45"
else "other"
END)
as name
from itlg

как видно из запроса, результатом является символьное поле.
Вопрос : как сделать, чтобы результатом было 2,3 поля. Например нечто вроде следующего:

select
(CASE
WHEN field_a in (34,54) then "01 - 34,54", "aaa"
WHEN field_a in (44,45) then "02 - 44,45", "bbb"
else "other" , "other"
END)
as name, field_two
from itlg


Sandman25   (2003-10-28 15:15:00) [1]

[17] rel_ (28.10.03 14:57)

Именно так. К тому же должно быстрее работать из-за того, что не будет группировки по текстовым полям, а только по одному int.


rel_   (2003-10-28 14:57:00) [2]

Sandman25 © Логично : т.е. сначала дать Group By , а уже по нему Case.


Sandman25   (2003-10-28 11:41:00) [3]

[15] rel_ (28.10.03 11:26)

Можно разбить действие на операции: сначала найти все суммы по lgot_v, а потом объединить результаты для 34,54 и 44,55, и добавить имена.


rel_   (2003-10-28 11:26:00) [4]

Ну вот, в "Результате" всё съехало.
Попытка №2:

NAME KLLK KOL SUM_
-----------------------------------------
01 - 34,54 5269 2126 3833990,97
02 - 44,45 970 384 638943,72
other 132216 105359 100158100,9


rel_   (2003-10-28 11:23:00) [5]

to Sergey13 © Честно говоря я не совсем понисаю как мою задачу можно решить таким способом.

Как можно с помощью вычисляемых полей делать группировку по заданным группам записей.

Вот мой запрос (упростил, насколько возможно):

select b.name, b.kllk, b.kol, a.sum_
from
(select
(CASE
WHEN lgot_v in (34,54) then "01 - 34,54"
WHEN lgot_v in (44,45) then "02 - 44,45"
else "other"
END) as name,
sum(lg_1+lg_2+lg_3 + ....) as sum_
from itlg
where mes<="08.2003"
group by (
CASE
WHEN lgot_v in (34,54) then "01 - 34,54"
WHEN lgot_v in (44,45) then "02 - 44,45"
else "other"
END)
) a,

(select
(CASE
WHEN lgot_v in (34,54) then "01 - 34,54"
WHEN lgot_v in (44,45) then "02 - 44,45"
else "other"
END) as name,
sum(kllk) as kllk, sum(kol) as kol
from itlg
where mes="08.2003"
group by (
CASE
WHEN lgot_v in (34,54) then "01 - 34,54"
WHEN lgot_v in (44,45) then "02 - 44,45"
else "other"
END)
) b

where
b.name=a.name

Результат:

NAME KLLK KOL SUM_
01 - 34,54 5269 2126 3833990,97
02 - 44,45 970 384 638943,72
other 132216 105359 100158100,9

Вообще энто безобразие можно как-нибудь соптимизировать????


Sergey13   (2003-10-28 10:27:00) [6]

2rel_ (28.10.03 10:16) [12]
Чем не подходят вычисляемые на клиенте поля?


rel_   (2003-10-28 10:16:00) [7]

>>А вообще, исходный запрос рабочий?
Это упрощённый вариант. Могу скинуть весь запрос - если есть желание ковырять. Вообще есть желание его сократить.


DenK_vrtz   (2003-10-28 09:42:00) [8]

А по-моему, Sergey13 ©, прав. Если это частный случай(а запрос наводит на такую мысль), то вычисляемое поле лучший выход. Либо на это поле функцию повесить.
А вообще, исходный запрос рабочий?


rel_   (2003-10-28 09:41:00) [9]

to asp ©
Фантастика, только ничаго не понятно - сечас буду разбираться.


asp   (2003-10-28 09:35:00) [10]

rel_ (28.10.03 09:32) [7] > Имел в виду <Sergey13 © (28.10.03 09:18) [4]>


asp   (2003-10-28 09:33:00) [11]

Либо:
SELECT COALESCE(T2.NAME_1, "Other") AS NAME_1,
COALESCE(T2.NAME_2, "Other") AS NAME_2
FROM ITLG AS T1
LEFT OUTER JOIN (VALUES(34, "01 - 34,54", "aaa"),
(54, "01 - 34,54", "aaa"),
(44, "02 - 44,45", "bbb"),
(45, "02 - 44,45", "bbb)) AS T2(ID, NAME_1, NAME_2)
ON (T1.FIELD_A = T2.ID)

ЗЫ: Прокатит при условии "похожести" Oracle на DB2 ;)


rel_   (2003-10-28 09:32:00) [12]

to asp ©
>>Либо два условия
Что имеется в виду ???


Sergey13   (2003-10-28 09:24:00) [13]

А почему бы это вообше на клиенте не сделать? Два вычисляемых поля - и вперед. Даже быстрее будет, ИМХО.


asp   (2003-10-28 09:19:00) [14]

Либо два условия CASE, либо SELECT FROM (SELECT...)...


Sergey13   (2003-10-28 09:18:00) [15]

Никогда с таким синтаксисом не работал. Но, если первый вариант работает, может стоит попробовать

select
(CASE
WHEN field_a in (34,54) then "01 - 34,54"
WHEN field_a in (44,45) then "02 - 44,45"
else "other"
END)
as name,
(CASE
WHEN field_a in (34,54) then "aaa"
WHEN field_a in (44,45) then "bbb"
else "other"
END)
as field_two
from itlg


rel_   (2003-10-28 09:14:00) [16]

to asp © ORACLE 8i


asp   (2003-10-28 09:13:00) [17]

СУБД?


rel_   (2003-10-28 09:07:00) [18]

Мастера, ну хоть кто-нибудь отсоветуйте что-нибудь !!!


Наверх

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