Portál AbcLinuxu, 12. května 2024 03:23


Dotaz: Pomoc so syntaxou SQL

12.4.2010 10:46 eth4rendil | skóre: 13
Pomoc so syntaxou SQL
Přečteno: 245×
Odpovědět | Admin
Dobrý deň,

snažím sa napísať jednu query ale bohužial neúspešne. vzor tabulky:
nazov    datum        hodnota
aaas     2010-03-10   a
aaad     2010-03-10   n
aaae     2010-03-10   a
aaab     2010-04-10   a
aaaq     2010-04-10   n
aaaw     2010-05-10   a
snažím dostať nasledovné: zistiť pre každý deň počet "a" a počet "n" teda výsledok by mal byť podľa tohoto vzoru takýto:
datum       hodnota_a  hodnota_n
2010-03-10  2          1
2010-04-10  1          1
2010-03-10  0          1
viem spraviť ale iba cez dva selecty
SELECT datum, count(*)
FROM tabulka
WHERE hodnota='a'
GROUP BY datum
ORDER BY datum DESC;
len tým dostanem iba počet "a" a neviem ako to vložiť to jednej query/výsledku databáza je MySQL.

ďakujem za akýkoľvek nápad
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

okbob avatar 12.4.2010 11:17 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: Pomoc so syntaxou SQL
Odpovědět | | Sbalit | Link | Blokovat | Admin
co treba
SELECT datum, sum(CASE WHEN hodnota = 'a' THEN 1 ELSE 0 END),
              sum(CASE WHEN hodnota = 'n' THEN 1 ELSE 0 END)
   FROM ...
  GROUP BY dataum;
12.4.2010 11:27 FooBar
Rozbalit Rozbalit vše Re: Pomoc so syntaxou SQL
Odpovědět | | Sbalit | Link | Blokovat | Admin
Netestovano na syntaktickou korektnost:
SELECT
 datum,
 COUNT(NULLIF(hodnota, 'n')) AS hodnota_a,
 COUNT(NULLIF(hodnota, 'a')) AS hodnota_n,
FROM
 tabulka
GROUP BY datum;
V pripade vetsiho mnozstvi hodnot muzes ten NULLIF pro opacnou hodnotu nahradit CASE vyrazem (pak by byla kazda polozka neco jako: COUNT(CASE WHEN hodnota = 'a' THEN 1 ELSE NULL END) AS hodnota_a).
12.4.2010 12:05 eth4rendil | skóre: 13
Rozbalit Rozbalit vše Re: Pomoc so syntaxou SQL
dakujem pekne za nápady mne sa to medzicasom podarilo spraviť takto
SELECT datum, count(*) as spolu,
COUNT(if(hodnota='a',1,null)) AS pocet_hodnota_a,
COUNT(if(hodnota='n',1,null)) AS pocet_hodnota_n,
CONCAT(round((COUNT(if(hodnota_a='a',1,null))/COUNT(*))*100,0), ' %') as uspesnost
FROM tabulka
GROUP BY datum
ORDER BY datum DESC;
bude jednať o väčšiu tabuľku a teraz neviem ktorá s týchto troch možností je najrýchlejšia? ešte v poslednom stĺpci som spravil percentuálnu úslešnosť. teda sú 4 stĺpce:
- dátum
- spolu
- pocet_hodnota_a (úspech)
- pocet_hodnota_n (neúspech)
- uspesnost
Nedá sa namiesto COUNT(if(hodnota_a='a',1,null)) použiť niečo jednoduchšie teda napr iba pocet_hodnota_a ? či to sa dá použit už iba v order klauzele?

ďakujem pekne

12.4.2010 13:00 kulik
Rozbalit Rozbalit vše Re: Pomoc so syntaxou SQL
Lze vnorenym selectem, tzn. nad vystupem (datum, pocet_a, pocet_n) dopocitat ty zbyvajici, coz bude i prehlednejsi. Na "stejne urovni" aliasy pouzit nelze.
Vzhledem k tomu, ze neuvadis ani o jakou databazi se jedna, ti tezko nekdo rekne, zda count bude rychlejsi nez sum. S nejvetsi pravdepodobnosti to nebud pozorovatelny rozdil. Pokud te rychlost opravdu trapi, tak se predevsim vykasli na formatovani sloupecku s procenty, to patri na prezentacni vrstvu.
okbob avatar 12.4.2010 13:26 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: Pomoc so syntaxou SQL
Úzké hrdlo SQL databází představují v 99% diskové operace, takže není nutné řešit, zda se použít COUNT nebo SUM. Důležitý je počet diskových operací (čtení/zápis). V obou případech budou stejné - můžete ovšem napsat totální blbost, čímž počet diskových operací znásobíte - např.
SELECT DISTINCT datum,
  (SELECT count(*) FROM tab WHERE datum = o.datum AND hodnota = 'a'),
  (SELECT count(*) FROM tab WHERE datum = o.datum AND hodnota = 'n')
  FROM tab o;
Tento dotaz bude dělat totéž, nicméně může být 1000x pomalejší.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.