Форум: "Базы";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];
ВнизЗапрос (case) Найти похожие ветки
← →
rel_ (2003-10-28 08:31) [0]Мастера, помогите с запросом.
Пишу следующее
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
← →
rel_ (2003-10-28 09:07) [1]Мастера, ну хоть кто-нибудь отсоветуйте что-нибудь !!!
← →
asp (2003-10-28 09:13) [2]СУБД?
← →
rel_ (2003-10-28 09:14) [3]to asp © ORACLE 8i
← →
Sergey13 (2003-10-28 09:18) [4]Никогда с таким синтаксисом не работал. Но, если первый вариант работает, может стоит попробовать
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
← →
asp (2003-10-28 09:19) [5]Либо два условия CASE, либо SELECT FROM (SELECT...)...
← →
Sergey13 (2003-10-28 09:24) [6]А почему бы это вообше на клиенте не сделать? Два вычисляемых поля - и вперед. Даже быстрее будет, ИМХО.
← →
rel_ (2003-10-28 09:32) [7]to asp ©
>>Либо два условия
Что имеется в виду ???
← →
asp (2003-10-28 09:33) [8]Либо:
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 ;)
← →
asp (2003-10-28 09:35) [9]rel_ (28.10.03 09:32) [7] > Имел в виду <Sergey13 © (28.10.03 09:18) [4]>
← →
rel_ (2003-10-28 09:41) [10]to asp ©
Фантастика, только ничаго не понятно - сечас буду разбираться.
← →
DenK_vrtz (2003-10-28 09:42) [11]А по-моему, Sergey13 ©, прав. Если это частный случай(а запрос наводит на такую мысль), то вычисляемое поле лучший выход. Либо на это поле функцию повесить.
А вообще, исходный запрос рабочий?
← →
rel_ (2003-10-28 10:16) [12]>>А вообще, исходный запрос рабочий?
Это упрощённый вариант. Могу скинуть весь запрос - если есть желание ковырять. Вообще есть желание его сократить.
← →
Sergey13 (2003-10-28 10:27) [13]2rel_ (28.10.03 10:16) [12]
Чем не подходят вычисляемые на клиенте поля?
← →
rel_ (2003-10-28 11:23) [14]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
Вообще энто безобразие можно как-нибудь соптимизировать????
← →
rel_ (2003-10-28 11:26) [15]Ну вот, в "Результате" всё съехало.
Попытка №2:
NAME KLLK KOL SUM_
-----------------------------------------
01 - 34,54 5269 2126 3833990,97
02 - 44,45 970 384 638943,72
other 132216 105359 100158100,9
← →
Sandman25 (2003-10-28 11:41) [16][15] rel_ (28.10.03 11:26)
Можно разбить действие на операции: сначала найти все суммы по lgot_v, а потом объединить результаты для 34,54 и 44,55, и добавить имена.
← →
rel_ (2003-10-28 14:57) [17]Sandman25 © Логично : т.е. сначала дать Group By , а уже по нему Case.
← →
Sandman25 (2003-10-28 15:15) [18][17] rel_ (28.10.03 14:57)
Именно так. К тому же должно быстрее работать из-за того, что не будет группировки по текстовым полям, а только по одному int.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c