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.
Pomůžete s SQL dotazem?
- ITCrowd
- Tvůrce článků
-
Guru Level 13.5
- Příspěvky: 23605
- Registrován: březen 10
- Pohlaví:
- Stav:
Offline
Pomůžete s SQL dotazem?
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
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
Re: Pomůžete s SQL dotazem?
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
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
Re: Pomůžete s SQL dotazem?
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
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ěkuju za vaše názory a rady.
- ITCrowd
- Tvůrce článků
-
Guru Level 13.5
- Příspěvky: 23605
- Registrován: březen 10
- Pohlaví:
- Stav:
Offline
Re: Pomůžete s SQL dotazem?
Stačí to takhle?
TypTel 1=firemní, 2=soukromý
PrefVol má jen 1, nebo 0
TypTel 1=firemní, 2=soukromý
PrefVol má jen 1, nebo 0
- Přílohy
-
- 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
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
Re: Pomůžete s SQL dotazem?
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í
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?
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í
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.
- ITCrowd
- Tvůrce článků
-
Guru Level 13.5
- Příspěvky: 23605
- Registrován: březen 10
- Pohlaví:
- Stav:
Offline
Re: Pomůžete s SQL dotazem?
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
- 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
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
Re: Pomůžete s SQL dotazem?
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:
<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.
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.
- ITCrowd
- Tvůrce článků
-
Guru Level 13.5
- Příspěvky: 23605
- Registrován: březen 10
- Pohlaví:
- Stav:
Offline
Re: Pomůžete s SQL dotazem?
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:
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
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
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
Re: Pomůžete s SQL dotazem?
Aha, ten dotaz jsi zkusil spustit, jestli vůbec funguje?
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?
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.
- ITCrowd
- Tvůrce článků
-
Guru Level 13.5
- Příspěvky: 23605
- Registrován: březen 10
- Pohlaví:
- Stav:
Offline
Re: Pomůžete s SQL dotazem?
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
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
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
Re: Pomůžete s SQL dotazem?
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?
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.
- ITCrowd
- Tvůrce článků
-
Guru Level 13.5
- Příspěvky: 23605
- Registrován: březen 10
- Pohlaví:
- Stav:
Offline
Re: Pomůžete s SQL dotazem?
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á.
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
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ů