Pomůžete s SQL dotazem?

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23605
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Pomůžete s SQL dotazem?

Příspěvekod ITCrowd » 28 bře 2019 15:09

Ahoj,
veškeré moje znalosti z SQL obsahují select from where atd. Čili naprostý laik.
Potřebuji výipis tabulky lidí - jména a kontakty. Problém je, že lidé mají více telefonních kontaktů a tím mám u některých více řádků. Potřeboval bych, aby u každého byl jen jeden řádek (jméno a kontakt). U telefonů je v DB rozlišeno, zda jde o firemní, nebo soukromý telefon a dále telefon s preferencí pro volání a nepreferovaný.
A potřeboval bych sesmolit dotaz, který by mi vrátil osobu i s kontaktem podle tohoto klíče postupně odshora dolů:
1. firemní s preferencí
2. firemní bez preference
3. soukromý s preferencí
4. soukromý bez preference
Tedy když je v tabulce člověk, co má 2 telefony - např. firemní bez preference a soukromý s preferencí, pak se vybere jen podmínka 2.
Pokud má všechny čtyři, pak se vybere jen podmínka 1.
Snad jsem to popsal srozumitelně.
Díky za pomoc.
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

Reklama
petrmet
Level 3
Level 3
Příspěvky: 440
Registrován: leden 15
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod petrmet » 28 bře 2019 18:13

Sice jsi nenapsal strukturu tabulky, ale i tak zkusím napsat dotaz pro inspiraci :
select a.id_klient, b.mintyp, a.kontakt
from klienti as a
join
(select id_klient,MIN(typ_kontaktu) mintyp
from klienti
group by id_klient) as b
on a.id_klient=b.id_klient and a.typ_kontaktu = b.mintyp

Uživatelský avatar
cervcek
Level 5
Level 5
Příspěvky: 2241
Registrován: leden 12
Bydliště: Vrchlabí
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod cervcek » 28 bře 2019 18:26

Ahoj, bylo by k té databázi nějaké grafické schéma pro lepší pochopení tvé situace?
Případně select * from <nazev_tabulky> a vyscreenovat/ nakopírovat záhlaví plus první řádky, kde ručně změníš/skryješ citlivá data např. na Jan Novák 603123456....? Nebo klidně do SZ.

Z dotazu mi totiž není jasné, zda se jedná o tabulku, kde je v jednom sloupci jméno, v druhém kontakt a ve třetím poznámka o jaké jde číslo (odtud by pak vznikaly duplicity na jména), protože by byla unikátní hodnota telefon a stejné jméno by bylo na víc řádcích.

V takovém případě bychom využili self join (spojení tabulky se sebou samou), přejmenovali sloupce ve výpisu a bylo by hotovo. Neznám ale primární identifikátor a strukturu, jak jsem psal výše, takže jakýkoliv SQL dotaz bych teď střílel od boku.

Dodatečně přidáno po 1 minutě 6 vteřinách:
Tak koukám, že než člověk zformuluje odpověď na mobilu ve vlaku, tak je dávno odpovězeno :D
Děkuju za vaše názory a rady. :thumbup:

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23605
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod ITCrowd » 28 bře 2019 18:41

Stačí to takhle?
TypTel 1=firemní, 2=soukromý
PrefVol má jen 1, nebo 0
Přílohy
Tab.png
Tab.png (4.81 KiB) Zobrazeno 1370 x
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

Uživatelský avatar
cervcek
Level 5
Level 5
Příspěvky: 2241
Registrován: leden 12
Bydliště: Vrchlabí
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod cervcek » 28 bře 2019 18:51

Ano, stačí. V tom seznamu se nemůžou setkat 2 Janové Novákové, kteří jsou jen jmenovci? Pokud ne, tak stačí udělat ten self join na základě jména. Pokud by mohly být ve sloupci jméno jmenovci, musel by se do tabulky přidat sloupec UID a každého si označkovat.

Dodatečně přidáno po 5 minutách 39 vteřinách:
Jinak buď mě někdo s odpovědí předběhne, nebo to pošlu cca za hodinu z PC, na mobilu je to víc scrollování, než psaní :D

Dodatečně přidáno po 10 minutách 32 vteřinách:
A ještě jeden dotaz. Ke každé osobě vždy existuje firemní i soukromé číslo telefonu? Pokud ne, dá se to říct o jednom z těch sloupců, nebo může nastat i případ, kdy Jan Novák má vyplněn pouze firemní telefon a Adam Novotný má vyplněn pouze soukromý telefon?
Děkuju za vaše názory a rady. :thumbup:

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23605
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod ITCrowd » 28 bře 2019 19:45

Odpovím:
- dva ani více Janů Nováku není. Dva řádky v tabulce jsou skutečně jen kvůli více kontaktům
- Některé osoby mají všechny telefony, jako Novák. Některé mají jen firemní telefon, některé jen soukromý telefon. Každá osoba má vždycky minimálně jeden telefon, a pokud jich má více stejného typu, vždy je tam zadána preference volání. Tedy tento případ:"může nastat i případ, kdy Jan Novák má vyplněn pouze firemní telefon a Adam Novotný má vyplněn pouze soukromý telefon" nastane.
Jinak díky, tomuhle fakt nehovím :-)
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

Uživatelský avatar
cervcek
Level 5
Level 5
Příspěvky: 2241
Registrován: leden 12
Bydliště: Vrchlabí
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod cervcek » 28 bře 2019 19:54

Aha, takže maximální počet telefonů na osobu je 4 a nikdy víc? To znamená, že osoba může mít firemní, firemní s preferencí, soukromý a soukromý s preferencí.

Výpis tedy chceš ve tvaru:
Jméno_příjmení, firemni_pref, firemni_druhy, soukromy_pref, soukromy_druhy
s tím, že to pořadí sloupců zde teď nehraje roli a můžu ho proházet podle tvé preference. Když nějaká z těch hodnot bude chybět, tak místo ní vypíše hodnotu null.

Dodatečně přidáno po 35 minutách 39 vteřinách:

Kód: Vybrat vše

select distinct osoba.jmeno "JMENO", soukr_1.cislo "SOUKROME_PREFEROVANE", soukr_2.cislo "SOUKROME_SEKUNDARNI", prac_1.cislo "FIREMNI_PREFEROVANE", prac_2.cislo "FIREMNI_SEKUNDARNI"
from <tabulka> osoba
left join <tabulka> soukr_1 on(osoba.jmeno=soukr_1.jmeno and soukr_1.TypTel='2' and soukr_1.PrefVol='1')
left join <tabulka> soukr_2 on(osoba.jmeno=soukr_2.jmeno and soukr_2.TypTel='2' and soukr_1.PrefVol='0')
left join <tabulka> prac_1 on(osoba.jmeno=prac_1.jmeno and prac_1.TypTel='1' and prac_1.PrefVol='1')
left join <tabulka> prac_2 on(osoba.jmeno=prac_2.jmeno and prac_2.TypTel='1' and prac_1.PrefVol='0');


<tabulka> vyměň za název tabulky
V prvním řádku lze prohazovat pořadí těch částí, které jsou oddělené čárkami, tím se prohodí pořadí sloupců ve výpisu.
Jméno je zde použito jako primární klíč, takže se nesmí stát, že do tabulky někdy zapíšeš jmenovce.
Názvy sloupců uvedené v uvozovkách lze libovolně změnit, nemá to žádný vliv na spojování dat.

Doufám, že jsem tam neudělal nějaký chyby, bez databáze se to nedá vyzkoušet. Kdyby ti to vypsalo nějakou chybu, tak to budeme debugovat.
Děkuju za vaše názory a rady. :thumbup:

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23605
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod ITCrowd » 29 bře 2019 08:38

Ahoj,
Výpis chci ve tvaru Jméno_Příjmení, Kontakt.
Ve sloupci Kontakt bude právě jen jedno číslo zvolené podle klíče, který jsem napsal na začátku:
1. firemní s preferencí
2. firemní bez preference
3. soukromý s preferencí
4. soukromý bez preference
Tedy z uvedené příkladové tabulky bych měl dostat tohle:

Kód: Vybrat vše

+---------+-------------+
|  Jméno  |   Kontakt   |
+---------+-------------+
|  Novák  |  123456789  | 
+---------+-------------+
|  Yanek  |  54465478   |
+---------+-------------+

Nedalo by se na to (ale nevím jak) použít třeba if..then? Zkoušel jsem to splácat s CASE, ale nedal jsem to :-)
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

Uživatelský avatar
cervcek
Level 5
Level 5
Příspěvky: 2241
Registrován: leden 12
Bydliště: Vrchlabí
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod cervcek » 29 bře 2019 17:54

Aha, ten dotaz jsi zkusil spustit, jestli vůbec funguje? :D
Dotaz upravím, to asi nebude problém. Jen mi moc nedává smysl, co jsi teď napsal. Má se vypsat jen jedno číslo? Tedy firemní, pokud nebude zadané firemní, tak soukromé. ALE pokud neexistuje firemní preferované, tak asi nebude existovat ani firemní sekundární, nebo se pletu? Analogicky by to bylo s osobním. Tedy podmínka "pokud není vyplněné firemní s preferencí, tak vypiš firemní bez preference", mi nedává smysl. Nebo jsou data zapsána tak, že pokud je u Nováka jen jedno číslo, tak je automaticky ve sloupci "preference" nula?
Děkuju za vaše názory a rady. :thumbup:

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23605
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod ITCrowd » 29 bře 2019 18:17

Zkusil, ale bez reakce...
A teď k těm telefonům:
Klasický firemní bor..l -
1.jsou lidi, kteří mají více firemních telefonů (manželky a tak :-) ), v tom případě je u nich vždy nastavena na jednom telefonu preference = 1.
2.Pak jsou lidi, kteří mají firemní telefon jen sami, v tom případě je zatrženo, nebo nezatrženo (1 nebo 0)...(bor...).
3.Dále jsou lidi, kteří mají firemní, ale doma nemají signál operátora. Ti pak mají u soukromého zatrženou preferenci pro soukromý.
4.Následují lidi, kteří nemají služební telefon, ale mají tarif. Ti se zase třídí na:
4.Mají více soukromých mobilů (manželky a tak), pak jeden z nich je s nastavením preference = 1.
5.Následují ti, kteří mají soukromý mobil, firemní tarif a nemají víc telefonů - tam je preference 0 nebo 1 (bor...)
6.A konečně lopatky, které mají soukromý mobil, soukromý tarif. U nich je jen jeden telefon buď 1 nebo 0 (bor...).
A z toho potřebuji tabulku, kde bude výstupem jméno a ke jménu přřazeno právě jedno číslo, na které se má volat.
Proto ten zajímavý klíč :-)
U dotazu mám pracovní dobu vyřešenu where sysdate between... To se týká lidí z bodu 2.
Dál jsem se bohužel nedostal :-(
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

Uživatelský avatar
cervcek
Level 5
Level 5
Příspěvky: 2241
Registrován: leden 12
Bydliště: Vrchlabí
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod cervcek » 29 bře 2019 20:16

Bez reakce znamená, že to vypsalo nějakou chybu, nebo prázdné záhlaví, či jen samotná jména bez čísel?
Bojím se, že toho bordelu je v té databázi nějak moc na to, abych z toho dokázal udělat nějakou logickou podmínku.
Možná jsi na tuto otázku již odpovídal, ale může nastat možnost, že má zaměstnanec 2 preferované telefony (firemní a soukromý), nebo je preference označena vždy jen u jednoho čísla u jednoho zaměstnance?
Děkuju za vaše názory a rady. :thumbup:

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23605
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Pomůžete s SQL dotazem?

Příspěvekod ITCrowd » 29 bře 2019 20:44

Stát se to nemůže. Preferovaný je vždy jen jeden.
A i kdyby to tak bylo, pak dle klíče by vypadl výsledek "firemní" "preferovaný".
Abychom si rozuměli - ten klíč funguje tak, že se probírají podmínky od bodu jedna, až do nalezení shody. Tedy pokud by tento dotaz narazil na "firemní" a zároveň "preferovaný" vypíše výsledek a dál nehledá.
V uvedeném příkladu:
Novák - kontroluju 1. "firemní" & "pref" => číslo 123456789 a dál mě už Novák nezajímá.
Yanek - 1. nic, 2. nic, 3. "soukromý" & "pref" => číslo 54465478 a dál už nehledá.
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů