CASE zwraca 3 kolumny

0

Witam
Mam pytanko związane z CASE w SQL.

Chciałbym żeby case zwracał mi 3 kolumny. na razie mam coś takiego

select cus_type,
Case
when cus_type='F' then cus_id || ' '|| cus_fname || ' '|| cus_lname
else cus_id || ' '|| cus_name
end
from customer ;

Czy mozna jakoś zrobić żeby nie używac || ' '|| tylko każda wartośc była w osobnej krotce oraz zeby nie wyświetlało cus_type?

Zapytanie ma wyświetlić informacje o wszystkich klientach: ID, imię i nazwisko dla klientów indywidualnych, lub ID i nazwę dla pozostałych klientów.

0
SELECT
  CASE WHEN cus_type='F' THEN cus_fname ELSE NULL END FNAME,
  CASE WHEN cus_type='F' THEN cus_lname ELSE NULL END LNAME,
  CASE WHEN cus_type='F' THEN NULL ELSE cus_name END NAME,
  cus_id ID
FROM customer;
0

(zmieniłem chwilowo login bo zarejestrowałem sie ale jeszcze nie dostałem potwierdzenia)

DZiekuje za odp

Następne pytanko
mam zapytanie

Select max(length(emp_fname)) from employee;

które pokazuje mi największą dł imienia pracowanika ale chciałbym jeszcze zeby wyświetliło to imie czyli wynik miałby być:

Bartek 6

0
Select max(length(emp_fname)), emp_fname from employee;
0
Marcin napisał(a)
Select max(length(emp_fname)), emp_fname from employee;

Właśnie tak nie działa bo wywala błąd
"to nie jest jednogrupowa funkcja grupowa"

0

Tak na sucho

SELECT MAX(LENGTH(EMP_FNAME)), EMP_FNAME
FROM EMPLOYEE
GROUP BY EMP_NAME

  • EWENTAULENIE TOP 1
0

Właśnie tak nie działa bo wywala błąd
"to nie jest jednogrupowa funkcja grupowa"

Powinno być tak:

select length(emp_fname), emp_fname from employee
where length(emp_fname) = (select max(length(emp_fname)) from employee)

Dzięki temu uzyskasz poprawne wyniki nawet w przypadku kilku imion o takiej samej maksymalnej długości.

0

dziekuje wszystkim :)

Mam jeszcze pytanko jak zrobić aby to było dobrze
Chodzi o to zeby z 1 tabeli wyciągnać ile zarabia pracownik i ile zarabia jego szef

select emp_id || ' ' || emp_fname || ' zarabia ' ||
emp_salary ||
case
WHEN emp_manager_id is null then ' jest szefem '
else ' ma szefa ' || emp_manager_id ||
' który zarabia ' ||
select emp_salary from employee where emp_id=emp_manager_id
end
from employee;

0

Jak zrobić aby wyświetlało mi tylko 1 wiersz z kazdego pro_cus_id z największym kosztem

select DISTINCT pro_cus_id, sum(to_number(pro_end_date-pro_begin_date)*1000) koszt
from project p
where pro_end_date is not null
GROUP by rollup(pro_cus_id, to_number(pro_end_date-pro_begin_date))
order by pro_cus_id;

teraz dostaje cos takiego
1 1000
1 23000
1 24000
3 118000
5 17000
7 1000
160000

a chce
1 24000
3 118000
5 17000
7 1000
160000

0
SELECT pro_cus_id, MAX( sum(to_number(pro_end_date-pro_begin_date)*1000)  )
from project p 
where pro_end_date is not null
GROUP BY pro_cus_id
ORDER BY 2
0

Max na sum nie działa ale juz doszedłem jak to rozwiązać dzieki Tobie dzieki

A czy móglby mi ktoś odpowiedziec na to poprzednie tzn:Chodzi o to zeby z 1 tabeli wyciągnać ile zarabia pracownik i ile zarabia jego szef??

0

I jeszcze jedno pytanko
Majac takie zapytanie

select e.emp_lname pracownik,
sum(case
when pm.prm_end_date is null then to_number(round(sysdate-pm.prm_begin_date))+1
else to_number(round(pm.prm_end_date-pm.prm_begin_date))+1
end) dni,
round(sum(case
when pm.prm_end_date is null then to_number(round(sysdate-pm.prm_begin_date))+1
else to_number(round(pm.prm_end_date-pm.prm_begin_date))+1
end)/30) miesiace,
sum(case
when pm.prm_end_date is null then to_number(round(sysdate-pm.prm_begin_date))+1
else to_number(round(pm.prm_end_date-pm.prm_begin_date))+1
end)1350 przychod,
sum(case
when pm.prm_end_date is null then to_number(round(sysdate-pm.prm_begin_date))+1
else to_number(round(pm.prm_end_date-pm.prm_begin_date))+1
end
1350-e.emp_salary) praca
from pro_mem pm inner join employee e on e.emp_id= pm.prm_emp_id
GROUP by rollup(e.emp_lname, pm.prm_pro_id)
having prm_pro_id is null
order by 1;

moge zrobic aby to wyrażenie było jakąś zmienną i nie trzeba było pytać o to tyle razy

sum(case
when pm.prm_end_date is null then to_number(round(sysdate-pm.prm_begin_date))+1
else to_number(round(pm.prm_end_date-pm.prm_begin_date))+1
end*1350

żeby było

select e.emp_lname pracownik,
var dni, round(var/30) miesiace, var*1350 przychod, var-e.emp_salary zarobek
from pro_mem pm inner join employee e on e.emp_id= pm.prm_emp_id
GROUP by rollup(e.emp_lname, pm.prm_pro_id)
having prm_pro_id is null
order by 1;

0

bo popelnilem maly blad powinno byc

SELECT pro_cus_id, MAX( sum(to_number(pro_end_date-pro_begin_date)*1000)  )
from project p
where pro_end_date is not null
GROUP BY pro_cus_id, 2
ORDER BY 2
0

co do postu z 11-02-2009 13:17 konstrukcja WITH sie klania

0

Dalej gdy daje Max na sume to wywala błąd "To nie jest jednogrupowa funkcja grupowa"

a co do tego WITH to nie bardzo rozumiem?

0

btw bez maxa działa poprawnie i daje oczekiwany przeze mnie wynik

0
WITH cos as
(
SELECT
e.emp_lname pracownik,
sum(case
  when pm.prm_end_date is null then to_number(round(sysdate-pm.prm_begin_date))+1
  else to_number(round(pm.prm_end_date-pm.prm_begin_date))+1
end as x
from pro_mem pm inner join employee e on e.emp_id= pm.prm_emp_id
GROUP by rollup(e.emp_lname, pm.prm_pro_id)
having prm_pro_id is null
)

SELECT pracownik, x, x/30 
FROM cos
0

wszystko działa
dziekuje bardzo :)

0

a co do postu z 10-02-2009 23:00 też sobie poradziłem :)
Trzeba było zastosowac zapytanie skorelowane:

select emp_id || ' ' || emp_fname || ' zarabia ' ||
emp_salary ||
case
WHEN emp_manager_id is null then ' jest szefem '
else ' ma szefa ' || emp_manager_id ||
' który zarabia ' ||
(select emp_salary from employee e2 where e2.emp_id=e.emp_manager_id)
end
from employee e;

1 użytkowników online, w tym zalogowanych: 0, gości: 1