Diskuze: Výběrový dotaz
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
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ě
Š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)
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.
A toto?
SELECT * FROM Tabulka WHERE MAX(pzu_do) = 20141231
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.
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šší.
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
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ů)
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 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
Děkuju moc Všem za pomoc!
Zobrazeno 11 zpráv z 11.