Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-56707
Quit
2003-11-07 10:49
2003.11.17
Поиск формы


4-56954
Dark Elf
2003-09-22 12:55
2003.11.17
Открытие Help-файла


1-56733
Yuriy
2003-11-07 17:22
2003.11.17
Как использовать Thread если...


4-56961
Dmk
2003-08-29 00:55
2003.11.17
EnumForms


4-56956
avch
2003-09-19 09:50
2003.11.17
Оконное приложение на API





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский