![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос (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]
Мастера, ну хоть кто-нибудь отсоветуйте что-нибудь !!!