Diskuze: Výběrový dotaz

Ostatní jazyky SQL SQL a databáze Výběrový dotaz

Avatar
petr.chatar.anton:

Ahoj,
prosím Vás ještě jednou o radu. Mám tabulku (viz. obrázek) ucet, poradi, pzu_do.
Potřebuju z ní vybrat všechny ucty, které které mají pzu_do = 20141231 ale už za nimi není žádný další záznam, čili mají poradi = max(poradi). Na obrázku nevyhovuje žádný záznam.
Něco jako (pzu_do = 20141231) and (poradi = max(poradi)).
Děkuju.

 
Odpovědět 24.4.2015 13:26
Avatar
Odpovídá na petr.chatar.anton
Martin Konečný (pavelco1998):

Ahoj,

v první řadě slovo viz není zkratka, takže se za tím tečka nepíše.
V druho řadě zkus něco jako

SELECT ...
WHERE pzu_do = '20141231'
GROUP BY MAX(poradi)

// případně
GROUP BY sloupec HAVING MAX(poradi)

Myslím, že by to nějak takto mělo jít, ale neřeknu ti to z hlavy přesně

 
Nahoru Odpovědět 24.4.2015 14:17
Avatar
Lukáš Červený:

Šel bych na to spíš takhle:

SELECT ucet, MAX(poradi)
FROM tabulka
WHERE pzu_do = 20141231
GROUP BY ucet

Ověř si ale, že to vrací opravdu to, co potřebuješ :)
Tohle by mělo fungovat určitě:

SELECT ucet
FROM tabulka
WHERE pzu_do = 20141231
AND poradi = (SELECT MAX(poradi) FROM tabulka)
Editováno 24.4.2015 19:30
 
Nahoru Odpovědět 24.4.2015 19:28
Avatar
Odpovídá na Lukáš Červený
petr.chatar.anton:

Tak bohužel, žádné navržené řešení mi správné výsledky nevrací :(. Kdyby byl někdo ochotný mi pomoct, pošlu celou tabulku. Mám ji v XLSX, neumím ji sem přidat jako přílohu. PZU_DO je konec platnosti účtu, PORADI je pořadové číslo účtu a UCET je jasný. Potřebuju vybrat účty, které skončily k 31.12.2014 (20141231) a není založen účet další. Je to např. účet 69197, poradi 0, nebo 69180, poradi 8.

Editováno 27.4.2015 9:36
 
Nahoru Odpovědět 27.4.2015 9:33
Avatar
Odpovídá na petr.chatar.anton
Michal Štěpánek:

A toto?

SELECT * FROM Tabulka WHERE MAX(pzu_do) = 20141231
Nahoru Odpovědět 27.4.2015 10:48
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
petr.chatar.anton:

Hodí chybu:
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

 
Nahoru Odpovědět 27.4.2015 11:30
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na petr.chatar.anton
David Čápka:

Co ti poslal Lukáš Červený musí fungovat:

SELECT ucet
FROM tabulka
WHERE pzu_do = 20141231
AND poradi = (SELECT MAX(poradi) FROM tabulka)

Z tvého zadání se nedá moc vyčíst jaké pořadí chceš. Možná chceš spíš tohle:

SELECT ucet
FROM tabulka
WHERE pzu_do = 20141231
AND poradi = (SELECT MAX(poradi) FROM tabulka WHERE pzu_do = 20141231)

Jinak to pak jde udělat nějak i tím GROUP BY,ale tohle mi přijde jednodušší.

Nahoru Odpovědět 27.4.2015 11:53
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
petr.chatar.anton:

Asi bych podmínku napsal takhle:
pzu_do = 20141231 AND poradi <= max(poradi)
Dám sem ještě vzorek dat okolo těch účtů, co jsem napsal výše (TUČNĚ JSOU TY ZÁZNAMY, KTERÉ POTŘEBUJU VYBRAT):

UCET PORADI PZU_DO


69170 9 20111231
69170 10 99999999
69180 0 19991231
69180 1 20001231
69180 2 20011231
69180 3 20021231
69180 4 20031231
69180 5 20041231
69180 6 20051231
69180 7 20061231
69180 8 20141231
69180 9 99999999
69190 9 99999999
69190 0 20011231
69190 1 20021231
69190 2 20031231
69190 3 20041231
69190 4 20051231
69190 5 20061231
69190 6 20111231
69190 8 20141231
69194 0 20031231
69194 1 20041231
69194 2 20051231
69194 3 20061231
69194 4 20111231
69195 0 20051231
69195 1 20111231
69196 1 20111231
69197 0 20141231
69197 1 99999999
69198 0 20121231
69199 0 99999999

Editováno 27.4.2015 12:44
 
Nahoru Odpovědět 27.4.2015 12:42
Avatar
petr.chatar.anton:

No, tu podminku sem zmršil.
Měla by být takhle:
pzu_do = 20141231 AND poradi = max(poradi)
(max(poradi) ve skupině stejných čísel účtů)

 
Nahoru Odpovědět 27.4.2015 12:59
Avatar
Lukáš Červený:

Aha, už rozumím, nejasně ses vyjádřil. Toto: "max(poradi) ve skupině stejných čísel účtů" jsi měl říct už na začátku :D Dotaz pak vypadá takhle:

SELECT ucet, poradi, pzu_do
 FROM tabulka
 INNER JOIN (SELECT ucet AS c_uctu, MAX(poradi) AS max_pro_ucet FROM tabulka GROUP BY ucet) m ON m.c_uctu = ucet AND m.max_pro_ucet = poradi
 WHERE pzu_do = 20141231
Editováno 27.4.2015 19:15
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 27.4.2015 19:14
Avatar
petr.chatar.anton:

Děkuju moc Všem za pomoc!

 
Nahoru Odpovědět 28.4.2015 11:17
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.