Zapytania w Oracle SQL [Pilne]

0

Witam.
Mam mam 2 bardzo pilne w rozwiązaniu problemy z Oracle SQL. Czy może mi ktoś pomóc je rozwiązać

A oto dwa zapytania:
1.Problem stanowi błąd: ORA-01791: not a SELECTed expression, który nie występuje po wyłączeniu linijki count(p.barcode_id) oraz pominięciu GROUP BY oraz ORDER BY, które oczywiście są mi niezbędne :(

select distinct
c.cgn_country, (case when p.spr_id = 'RETUR' then p.snd_id else p.cgn_id end), to_char(c.created_date,'YYYY-MM-DD'), c.cgn_address, c.cgn_zip, c.cgn_name, p.barcode_id,
to_char(c.time_arr,'YYYY-MM-DD'), p.grs_wgt, count(p.barcode_id), p.vot, c.hu_qty
from vs_cusord c
join vs_cusord_pcs p on p.CO_FK=c.PK
where c.ord_id like 'COPL%' and c.xaccount_id like 'CUSTOMER%' and to_char(p.created_date,'YYYY-MM-DD') = (case to_char(sysdate,'day') when 'monday   ' then to_char(sysdate-3,'YYYY-MM-DD') when 'tuesday  ' then to_char(sysdate-1,'YYYY-MM-DD') when 'wednesday' then to_char(sysdate-1,'YYYY-MM-DD') when 'thursday ' then to_char(sysdate-1,'YYYY-MM-DD') when 'friday   ' then to_char(sysdate-1,'YYYY-MM-DD') end )
group by
c.cgn_country, case when p.spr_id = 'RETUR' then p.snd_id else p.cgn_id end, to_char(c.created_date,'YYYY-MM-DD'), c.cgn_address, c.cgn_zip, c.cgn_name, p.barcode_id,  to_char(c.time_arr,'YYYY-MM-DD'), p.grs_wgt, p.vol, c.hu_qty
order by c.ord_id
  1. Drugim problemem jest pobranie daty za dzień poprzedni z konkretną godziną (18:00) i wyświetlenie tego w formacie 24-godzinnym (jeden z elementów BETWEEN'a. A oto kod:
select
pcs.barcode_ext_id, max(tr.event_date), LISTAGG(tr.reason_id, ', ') WITHIN GROUP (order by tr.pk), tr.platform_id, (to_date(to_char(to_char((sysdate-1),'yyyy-mm-dd')||' 18:00:00'),'yyyy-mm-dd hh24:mi:ss') ), (to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'))
from vs_cusord_pcs pcs
left join vs_trace tr on pcs.pk=tr.pcs_fk
where tr.ord_id like 'COPL%'
and pcs.xaccount_id = 'CUSTOMER'
and to_char(pcs.created_date,'YYYY-MM-DD HH24:MI:SS') between to_date(to_char(sysdate-1,'YYYY-MM-DD') || ' 18:00:00','YYYY-MM-DD HH24:MI:SS') and to_date(to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')
and pcs.DEL_TRC_DATETIME is null
and (tr.reason_id in  ('UMP','LMP') or tr.reason_id in ('LPL','ULP','UMP','LMP') or tr.reason_id in ('LPL','ULP'))	
group by
pcs.barcode_ext_id, tr.reason_id, tr.platform_id

Tutaj problem występuje typu: ORA-01861: literal does not match format string

Z góry dziękuję za pomoc w szybkim rozwiązaniu problemów

0

Pierwsze to pewnie group by po kolumnie której nie selektujesz. Albo ją wyselektuj razem z danymi albo zrób group by po innej.
W drugim może spróbuj samo to_date bez tego to_char.

0

pierwsze zobacz tak

SELECT DISTINCT 
  c.cgn_country,
	CASE WHEN p.spr_id = 'RETUR' THEN p.snd_id ELSE p.cgn_id END,
	to_char(c.created_date, 'YYYY-MM-DD'),
	c.cgn_address,
	c.cgn_zip,
	c.cgn_name,
	p.barcode_id,
	to_char(c.time_arr, 'YYYY-MM-DD'),
	p.grs_wgt,
	COUNT(p.barcode_id),
	p.vot,
	c.hu_qty
FROM 
  vs_cusord c
INNER JOIN vs_cusord_pcs p ON p.CO_FK = c.PK
WHERE 
  c.ord_id LIKE 'COPL%'
	AND c.xaccount_id LIKE 'CUSTOMER%'
	AND to_char(p.created_date, 'YYYY-MM-DD') = CASE to_char(sysdate, 'day') WHEN 'monday   ' THEN to_char(sysdate - 3, 'YYYY-MM-DD') ELSE to_char(sysdate - 1, 'YYYY-MM-DD') END
GROUP BY 
  c.cgn_country,
	CASE  WHEN p.spr_id = 'RETUR' THEN p.snd_id ELSE p.cgn_id END,
	to_char(c.created_date, 'YYYY-MM-DD'),
	c.cgn_address,
	c.cgn_zip,
	c.cgn_name,
	p.barcode_id,
	to_char(c.time_arr, 'YYYY-MM-DD'),
	p.grs_wgt,
	p.vol,
	c.hu_qty
ORDER BY c.ord_id

na drugie masz odpowiedź gdzieś indziej (nie zadawaj tego samego pytania w różnych wątkach)

BTW ten kod wygląda PASKUDNIE

0

OK. Problem rozwiązany poprzez użycie tylko to_date ;)

A BTW kod nie był pisany przeze mnie, dostałem go tak jak wpisałem właśnie z problemem o którym napisałem tutaj ;)

0

Witam. Poniżej kod 3 bardzo pilnego zapytania. Nie mogę poradziś sobie z funkcja CUBE \ ROLLUP. Pomoże ktoś (błąd: "not a GROUP BY expression") ?

with dane as (select
case when (instr(co.CGN_id,'.') > 0) then substr(co.CGN_id,0,(length(co.CGN_id)-(length(co.xaccount_id) + 1))) else co.CGN_id end kod,
co.cgn_name nazwa,
pcs.LAST_SCANNED_PLATFORM_ID platforma,
pcs.trip_line_id tura,
pcs.barcode_ext_id numer_paczki,
pcs.grs_wgt waga,
to_char(pcs.LAST_SCANNING_DATE,'yyyy-mm-dd hh24:mi:ss') scan,
round(((count(pcs.LAST_SCANNING_DATE) over ())/(count(pcs.barcode_ext_id) over ()))*100,2)||' %' scan_ile,
sum(pcs.grs_wgt) over () sum_waga,
to_char(pcs.created_date,'DD') data
from vs_cusord_pcs pcs
join vs_cusord co on co.pk=pcs.co_fk
where co_id like 'COPL%'  and pcs.spr_id not like 'RET%'
and to_char(pcs.created_date,'yyyy-mm-dd') between '2015-10-01' and
'2015-10-10')

select distinct
kod,
nazwa,
tura,
platforma,
tura,
numer_paczki,
waga,
scan,
scan_ile,
sum_waga,
count(distinct kod) over () ile_dealer,
data
from dane
GROUP BY CUBE (kod)
ORDER BY kod
--order by 2,7,1

jest ktoś w stanie pomóc ?

0

A co to niby znaczy group by cube... wg ciebie? o_O Cube to operator podsumowania a grupowanie odbywa się po konkretnych kolumnach.

0

OK. Może tak. Zrobiłem grupowanie z użyciem ROLLUP po dwóch kolumnach. Muszę w to wpleść, funkcje sum dla każdego z podsumowania po danej kolumnie

0

To zamiast rollup polecam Ci

grouping sets

http://docs.oracle.com/cd/B19306_01/server.102/b14223/aggreg.htm#i1006842
Daje dużo większe możliwości niż rollup choć trzeba przywyknąć do składni :)

0

A można w tym grupować po wynikach funkcji (np. SUM) ??

Albo jak wpleść takie podsumowanie, np. jako oddzielną kolumnę ?

0

Spoko, próbuje ponad pół godziny i nic. Nie wiem jak zrobić kolumnę, której wartością byłby wynik funkcji SUM dla dla grupowania po danej kolumnie.

Na daną chwilę mam oto taki kod:

with dane as (select
case when (instr(co.CGN_id,'.') > 0) then substr(co.CGN_id,0,(length(co.CGN_id)-(length(co.xaccount_id) + 1))) else co.CGN_id end kod,
co.cgn_name nazwa,
pcs.LAST_SCANNED_PLATFORM_ID platforma,
pcs.trip_line_id tura,
pcs.barcode_ext_id numer_paczki,
pcs.grs_wgt waga,
to_char(pcs.LAST_SCANNING_DATE,'yyyy-mm-dd hh24:mi:ss') scan,
round(((count(pcs.LAST_SCANNING_DATE) over ())/(count(pcs.barcode_ext_id) over ()))*100,2)||' %' scan_ile,
sum(pcs.grs_wgt) over () sum_waga,
to_char(pcs.created_date,'DD') data
from vs_cusord_pcs pcs
join vs_cusord co on co.pk=pcs.co_fk
where co_id like 'COPL%'  and pcs.spr_id not like 'RET%'
and to_char(pcs.created_date,'yyyy-mm-dd') between '2015-10-01' and
'2015-10-10')

select distinct
kod,
nazwa,
tura,
platforma,
numer_paczki,
waga,
scan,
scan_ile,
sum_waga,
count(distinct kod) over() ile_dealer,
data
from dane
group by
kod,
nazwa,
tura,
platforma,
numer_paczki,
waga,
scan,
scan_ile,
sum_waga,
data,
ROLLUP (data,kod)
order by data,kod
0

Nikt nie jest w stanie pomóc ?

0

pewnie ktoś by pomógł jakbyś dał DDL tabel, inserty z przykładowymi danymi (ba może być nawet jakiś sensowny dump) bo tak na sucho to sobie można

0

No teraz mi nie łatwo bo dane brane są z dwóch tabel, które małe nie są.

Może podpowiedziałbyś jak zrobić te sumowanie po każdym dniu (kolumna DATA), gdyż to chciałbym osiągnąć. Aby każdy z wartości kolumny DATA (po której to wartości zrobiłem grupowanie z użyciem ROLLUP) miał swoje oddzielne sumowanie wartości kolumny waga

1

Wiesz mi się naprawdę nie chce rozkminiać co autor miał na myśli, szczególnie, że sam nie bardzo wiesz jak do tematu podejść. Ja potrzebuję wiedzieć jakie mam dane (albo chociaż tabele) i jaki wynik z nich chcesz otrzymać. Najprościej i najlepiej przedstawia się to dając dane wejściowe i wyjściowe. Zrobienie tego to jest jakieś 10 minut roboty

  1. robisz eksport z tabeli pierwszej
create table vs_cusord_pcs_przykladowe as SELECT * FROM vs_cusord_pcs WHERE to_char(pcs.created_date,'yyyy-mm-dd') BETWEEN '2015-10-01' AND '2015-10-10')
  1. i eksport z tabeli drugiej
create table vs_cusord_przykladowe as select * from vs_cusord where pk in (select co_fk from vs_cusord_pcs_przykladowe)

i masz dwie tabele z danymi z 10 dni
3. teraz robisz eksport tabel - expdp user/pass@tnsname tables=vs_cusord_pcs_przykladowe,vs_cusord_przykladowe directory=patrz(4) dumpfile=dotestow.dmp
4. jakie masz zdefiniowane katalogi możesz zobaczyć tak SELECT * FROM dba_directories
5. pakujesz plik dotestow.dmp 7zipem i wrzucasz np. na google drive

0

Nie mogę stworzyć nowej tabeli tymi komendami :(
ORA-00933: SQL command not properly ended

0

hasło mam zapisane

0

ja się poddaje.

Musisz zrozumieć jedno - tu nie ma jasnowidzów! Jak chcesz pomocy to musisz jasno określić problem. Na dobrą sprawę chyba nikt poza Tobą nie wie co to zapytanie ma zwracać a chcesz żeby ktoś to poprawił. Tak się nie da

0

Zapytanie ma zwracać dane jak w select. I grupować je po: numerze dnia, kodzie (piewsza kolumn) i wyświetlać podumowanie wagi dla każdego z numerów dni

0
GROUP BY
nazwa,
tura,
platforma,
numer_paczki,
waga,
scan,
scan_ile,
sum_waga,
ROLLUP (DATA,kod)
ORDER BY DATA,kod
0

Pomogło wrzucenie w over() kolumny po której ma zliczać, czyli w moim przypadku pobranie numerdu dnia z kolumny created_date. Kolejne pytanie i zarazem problem próbowałem dać podobne przy distinct kod, lecz nie chce mi tego przyjąć. Jak pobrać ilość unikalnych kodów (wartości kolumny kod) dla danego dnia?

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