NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
petr.chatar.anton:24.4.2015 13:26

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):24.4.2015 14:17

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Lukáš Červený:24.4.2015 19:28

Š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:27.4.2015 9:33

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:27.4.2015 10:48

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:27.4.2015 11:30

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 Hartinger
Vlastník
Avatar
Odpovídá na petr.chatar.anton
David Hartinger:27.4.2015 11:53

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
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
petr.chatar.anton:27.4.2015 12:42

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:27.4.2015 12:59

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ý:27.4.2015 19:14

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í
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
27.4.2015 19:14
Avatar
petr.chatar.anton:28.4.2015 11:17

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.