Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.17;
Скачать: CL | DM;

Вниз

Запрос (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
1-56659
Raduga
2003-11-05 11:22
2003.11.17
Процессы и СОМ-объекты


14-56918
Alex134
2003-10-23 22:26
2003.11.17
ищу хостинг для домашней странички


3-56526
Berg
2003-10-27 15:39
2003.11.17
Конвертирование Parodox в MySQL


11-56546
Boguslaw
2003-02-18 21:00
2003.11.17
database, how to implement ? any suggestions ?


1-56627
Deb
2003-11-05 00:28
2003.11.17
проблема с созданием Popup