Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 8 odgovora
  • 12.229 pregleda

Najnovija ↓

Pomoc kod upita - odbaciti nepotrebne 13.06.2017. u 20:35 · pre 114 meseci #1
Imam sledecu situaciju u bazi

godina - artikl
2015 - 40
2016 - 40
2017 - 40
---------------
2015 - 41
2017 - 41
----------------
2016 - 50
2017 - 50
----------------
2017 - 55

potrebni su mi artikli koji postoje ili u sve tri godine (2015, 2016, 2017) ili u poslednje dve (2016, 2017) ili u poslednjoj 2017. Treba mi nacin da iskljucim artikl 41 koji postoji samo u 2015 i 2017. Jedino artikl 41 ne zadovoljava uslov za prikaz. Svaka pomoc je dobrodosla. Hvala unapred.

Edit : ili da ga iskljucim skroz ili da iskljucim samo red sa 2015 godinom kod artikla 41. Znaci ili skroz ili samo godinu koja nema 'nastavak' u sledecoj.
Re: Pomoc kod upita - odbaciti nepotrebne 14.06.2017. u 07:03 · pre 114 meseci #3
pomoglo bi mi da ih izbacim skroz iz rezultata ili da zadrzim samo drugi red u kom je 2017. bilo sta od to dvoje. da napomenem da ne mora maksimalno biti 3 godine, moze i vise. u bilo kojoj situaciji mi trebaju samo oni koji se pojavljuju bez rupa kroz godine.
Re: Pomoc kod upita - odbaciti nepotrebne 14.06.2017. u 10:51 · pre 114 meseci #4
Ako uzmemo u obzir da se tvoja tabela zove 'artikli' prvo napravis tabelu koja ce da sadrzi sve moguce kombinacije godina i artikala...

Code:

create temporary table if not exists table1 as (
select distinct t1.artikal, t2.godina
from artikli as t1
cross join artikli as t2
)


Onda proveris koji sve zaista postoje odnosno ne postoje...

Code:

create temporary table if not exists table2 as (
select distinct t1.artikal
from table1 as t1
left join artikli as t2
on t1.godina = t2.godina
and t1.artikal = t2.artikal
where t2.godina is null
)


Kada si dobio one koji ne postoje onda uzmes samo one koji postoje...

Code:

select *
from artikli as t1
where t1.artikal not in (select artikal from table2)


Napisao sam ovo sve na brzinu pa javi ako ima nekih problema i gde :)
Re: Pomoc kod upita - odbaciti nepotrebne 14.06.2017. u 11:15 · pre 114 meseci #5
pazi, mozda sam i na drugi nacin sada prevazisao problem pa mi odgovor i ne treba. Ali zarad odgovora tvoj predlog skripi jer ja treba da znam da li fali unutrasnja godina (2016 u primeru artikla 41) jer mi samo to zadovoljava uslov da ga ne prikazem. Ako je situacija kao kod artikla 50 iz primera njega ne treba da eliminisem iako ne postoji u 2015 godini. ja ne umem nedvosmisleno ni da objasnim problem ne zato sto sam nepismen nego je specifican uslov u pitanju.
Re: Pomoc kod upita - odbaciti nepotrebne 14.06.2017. u 11:21 · pre 114 meseci #6
Pod pretpostavkom da ti je (godina, artikl) unique, možeš početi od nečega ovakvog:

Code:

select artikal, max(godina) as max_godina
from prodaja
group by artikal
having count(*) = max(godina) - min(godina) + 1;


pa onda to koristiti kao unutrašnji upit ili view za dalje.

Može i JOIN-ovima kako je informer krenuo, ali malo je teže.
Sviđa mi se1
Re: Pomoc kod upita - odbaciti nepotrebne 14.06.2017. u 11:25 · pre 114 meseci
izmenjeno 1 put, poslednji put dusans 14.06.2017. u 11:39
  1. dusans14.06.2017. u 11:39zapis iz teksta poruke
#7
@Informer

Ovo je u principu OK, pronalazi sve artikle koji se pojavljuju u svim godinama.
Dakle, ako se negde pojavi rupa - taj artikal neće biti u rezultatima.

Međutim, koliko sam ja shvatio - početak nije rupa i to pravi dodatni problem:
Code:

Godine: 2015, 2016, 2017, 2018, 2019, 2020

A se pojavljuje u: 2019, 2020
B se pojavljuje u: 2020
C se pojavljuje u: 2018
D se pojavljuje u: 2015, 2016, 2017, 2018, 2019, 2020
E se pojavljuje u: 2017, 2018, 2019

A, B, D bi trebali da budu u rezultatima. C, E ne bi smeli.

@Orome

Uradi join na jablanov upit po artikal = artikal i max_godina = globalna_max_godina i to je to.
Re: Pomoc kod upita - odbaciti nepotrebne 14.06.2017. u 12:00 · pre 114 meseci #8
Traženje artikala sa rupama uz pomoć JOIN-ova (bez potrebe za tabelom sa godinama):

Code:

select * from prodaja p1
left join prodaja p2 on p1.artikal = p2.artikal and p1.godina = p2.godina + 1
left join prodaja p3 on p1.artikal = p3.artikal and p3.godina < p1.godina
left join prodaja p4 on p1.artikal = p4.artikal and p4.godina = p3.godina + 1
where p2.artikal IS NOT NULL and p4.artikal IS NULL;


jbg komplikovano je.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme