Výsledky 1 až 7 z 7

Téma: My SQL - GROUP BY

Hybrid View

Předcházející příspěvek Předcházející příspěvek   Další příspěvek Další příspěvek
  1. #1

    Unhappy My SQL - GROUP BY

    Ahoj, SQL používám více-měne jenom na dotazování a jsem v tom tak trochu samouk po hození do vody, tak snad budu srozumitelná: nevíte někdo, jak napsat dotaz na získáni podílu (počtu rádků splňující nějakou podmínku z počtu všech řádků), když to beru po skupinách? Dávám SELECT ze dvou tabulek (dva krát tý samý), kde je COUNT ze zpodmínkované-okřesané tabulky a pak COUNT z celé tabulky. Problém je asi v tom, že na záver to korunujem jenom jediným GROUP BY (roky - z jedné z tabulek), takže, než dám mezi ty dvě COUNTy lomítko (děleno), vypisuje se mi v každém řádku (který přísluší jednomu roku) součin těch dvou. Nechci součin!!
    Připojuji pro ukázku i ten dotaz, zjednodušený o věci, které teď nejsou podstatné:
    select COUNT(*), COUNT(*), m.datum from Mereni m, Mereni n where m.idTyp =5 and n.idTyp = 5 and n.datum = m.datum and m.intuns_b = 128 and n.intuns_b=128 and m.intuns_c = 84 and n.intuns_c=84 and m.intuns_e = 2 and n.intuns_e=2 and m.platne = 1 and n.platne=1 and m.hodnota > 120 GROUP BY m.datum

    moc díík

  2. #2
    Senior Member mince Avatar uživatele mraky
    Založen
    16.10.2002
    Bydliště
    Praha
    Příspěvky
    1 166
    Vliv
    297
    Pište česky: hold × holt

    hold – projev pocty nebo úcty (další význam je výkupné, vynucený poplatek ve válce)
    holt – povzdech; ve významu „inu, zkrátka a dobře“

  3. #3
    Member
    Založen
    30.04.2004
    Bydliště
    U nových domů II/3 Praha 4
    Příspěvky
    260
    Vliv
    261

    Standardní Re: My SQL - GROUP BY

    Citace Původně odeslal Alibetka Zobrazit příspěvek
    Ahoj, SQL používám více-měne jenom na dotazování
    Ono lze používat SQL k něčemu jinému než k dotazování?

    Přečetl jsem si to 3x a i tak jsem to nepochopil. Pokud ale chceš countovat data s podmínkami, lze to udělat např. pomocí case. Třeba ale počítat s tím, že je to náročné na výkon.

    Např.
    Kód:
    case when sloupecX = 'Franta' then 1 else 0 end
    Toto ti vyhodí dataset, který bude countovat počet řádků s omezením "sloupecX = 'Franta' " (v oracle, v MS je to to samé jen bez "from dual", v My nevím)
    Kód:
    select sum(case when sloupecX = 'Franta'" then 1 else 0 end) from dual
    Petr Kočandrle

  4. #4
    Administrátor mince Avatar uživatele Jezevec
    Založen
    08.10.2002
    Bydliště
    Teplice
    Příspěvky
    6 738
    Vliv
    300

    Standardní Re: My SQL - GROUP BY

    Kód:
    select COUNT(*), COUNT(*), m.datum 
    
    from Mereni m, Mereni n 
    
    where m.idTyp =5 
    and n.idTyp = 5 
    
    and n.datum = m.datum 
    
    and m.intuns_b = 128 
    and n.intuns_b=128 
    
    and m.intuns_c = 84 
    and n.intuns_c=84 
    
    and m.intuns_e = 2 
    and n.intuns_e=2 
    
    and m.platne = 1 
    and n.platne=1 
    
    and m.hodnota > 120 
    
    GROUP BY m.datum
    a) count(*) lze pokud vim pouzit jen jednou a je to pocet vsech radku
    b) nebylo by od veci se naucit pouzivat join
    c) ty joinujes tabulku samu na sebe ?? duvod ?
    d) kdyz uz neco joinujes, tak do dusledku

    pr:
    Kód:
    from table_a
    join table_b on table_a.x = table_b.x and table_a.y = table_b.y ...

    Resil bych nejspi subselectem pr:

    Kód:
    select count(*) / (select count(*) from mereni) as podil, 
             datum
    from mereni
    where ...
    IMPROBE AMOR, QUID NON MORTALIA PECTORA COGIS - krutá jsi, lásko, kam až ty doženeš smrtelná srdce -- Vergilius
    Mnoho je prostředků, které léčí lásku, ale žádný není spolehlivý.
    S tím, čeho se na nás dopustili druzí se už nějak vyrovnáme. Horší je to s tím, čeho jsme se na sobě dopustili sami.
    -- Francois La Rochefoucauld
    Nabídnout přátelství tomu, kdo chce lásku, je jako dát chleba tomu, kdo umírá žízní.

  5. #5

    Standardní Re: My SQL - GROUP BY

    Tak jo, chyba je, že jsem se snažila ten dotaz zjednodušit a tak jsem tam udělala zásadní chybu (COUNT je pokaždé z jiné tabulky - jednou z té, co ji vyfiltruji, podruhé z té, kde je všecko, abych na závěr slávnostně vložila lomítko a měla podíl pro jednotlivé roky), což to znepřehlednilo. Kopíruji dotaz radši tak, jak jej užívám:

    select COUNT(m.intuns_a), COUNT(n.intuns_a), m.datum from Mereni m JOIN Mereni l on m.intuns_a = l.intuns_b, Mereni n where m.idTyp =5 and l.idTyp = 6 and n.idTyp = 5 and m.datum= l.datum and n.datum = m.datum and l.intuns_a IN (25372, 29747) and m.intuns_b = 128 and n.intuns_b=128 and m.intuns_c = 84 and n.intuns_c=84 and m.intuns_e = 2 and n.intuns_e=2 and m.platne = 1 and l.platne = 1 and n.platne=1 and m.hodnota > 120 and l.hodnota > 35 GROUP BY m.datum, n.datum

    Výsledkem je (první řádek je hlavička):

    COUNT( m . intuns_a ) COUNT( n . intuns_a ) datum
    5565 5565 2002-00-00
    4697 4697 2003-00-00
    3800 3800 2004-00-00
    6392 6392 2005-00-00
    8360 8360 2006-00-00
    2772 2772 2008-00-00



    Pričemž když to udělám oddělelně, tak to vypadá takto:

    1. dotaz - po filtru podmínek a po zgrupování:

    select COUNT(m.intuns_a), m.datum from Mereni m JOIN Mereni l on m.intuns_a = l.intuns_b where m.idTyp =5 and l.idTyp = 6 and m.datum= l.datum and l.intuns_a IN (25372, 29747) and m.intuns_b = 128 and m.intuns_c = 84 and m.intuns_e = 2 and m.platne = 1 and l.platne = 1 and m.hodnota > 120 and l.hodnota > 35 GROUP BY m.datum

    výsledek:

    COUNT( m . intuns_a ) datum
    53 2002-00-00
    61 2003-00-00
    50 2004-00-00
    68 2005-00-00
    88 2006-00-00
    36 2008-00-00



    2. dotaz - všechny řádky (ale zgrupované, samozřejmě):

    select COUNT(m.intuns_a), m.datum from Mereni m where m.idTyp =5 and m.intuns_b = 128 and m.intuns_c = 84 and m.intuns_e = 2 and m.platne = 1 GROUP BY m.datum

    výsledek:

    COUNT( m . intuns_a ) datum
    105 2002-00-00
    77 2003-00-00
    76 2004-00-00
    94 2005-00-00
    95 2006-00-00
    77 2008-00-00



    Takže je vidět, že v původním dotazu o který jde, jde o součin. A je to podle mně kvůli tomu "společnému" GROUP BY.

    Zkoušela jsem i tohle jako jiný způsob:

    select COUNT( m . intuns_a ) , cp . celk_pocet , m . datum from Mereni m JOIN Mereni l on m . intuns_a = l . intuns_b , ( select COUNT( x . intuns_a ) as celk_pocet , x . datum from Mereni x where x . idTyp = 5 and x . intuns_b = 128 and x . intuns_c = 84 and x . intuns_e = 2 and x . platne = 1 GROUP BY x . datum ) as cp where m . idTyp = 5 and l . idTyp = 6 and l . intuns_a IN ( 25372 , 29747 ) and m . intuns_b = 128 and m . intuns_c = 84 and m . intuns_e = 2 and m . platne = 1 and l . platne = 1 and m . hodnota > 120 and l . hodnota > 35 GROUP BY m . datum

    - tu je podla mna cesta, ale nevím jak po ní dál, očividne totiž z té druhé - vytvořené tabulky to bere pokaždé jenom první řádek:

    COUNT( m . intuns_a ) celk_pocet datum
    1540 105 2002-00-00
    1827 105 2003-00-00
    1757 105 2004-00-00
    1869 105 2005-00-00
    2296 105 2006-00-00
    1736 105 2007-00-00
    1365 105 2008-00-00

    Tak jsem byla trochu obšírnější, ale snad to bude k dobru věci.. Napadá vas něco? Mně vůbec, ale možná existuje velice prosté pravidlo, příkaz nebo něco.. Moc dík
    Naposledy upravil Alibetka; 19.10.2009 v 17:15.

  6. #6
    Administrátor mince Avatar uživatele Jezevec
    Založen
    08.10.2002
    Bydliště
    Teplice
    Příspěvky
    6 738
    Vliv
    300

    Standardní Re: My SQL - GROUP BY

    Uvedom si, ze kdyz udelas select z tabulky, ktera ma rekneme 1000 polozek a pritom udelas join teze tabulky pres pole ktere neni unikatni, tak ti muze vzniknout tabulka ktera ma 1000x1000 polozek. A to je presne to co delas (v prvnim pripade tu tabulku pouzivas dokonce 3x).

    navic GROUP BY m.datum, n.datum je nadbytecny, pokud mas prave pres toto pole ten join.

    count(abc) pak ma smysl pouze v pripade, ze se v joinovane tabulce muze vyskytnout hodnota null (takovy vysledek se pak do poctu nezapocita) jinak je to stejne jako count(*), coz je tvuj pripad. Joinujes stejnou tabulku, takze NULL vzniknout nemuze, vzdy existuje min jeden prvek (ten samy) ktery odpovida. Takto to co chces neziskas.

    Edit: Mozna zkus decentne popsat strukturu a trochu vic nastinit co ma byt vysledkem dotazu.
    Naposledy upravil Jezevec; 19.10.2009 v 18:14.
    IMPROBE AMOR, QUID NON MORTALIA PECTORA COGIS - krutá jsi, lásko, kam až ty doženeš smrtelná srdce -- Vergilius
    Mnoho je prostředků, které léčí lásku, ale žádný není spolehlivý.
    S tím, čeho se na nás dopustili druzí se už nějak vyrovnáme. Horší je to s tím, čeho jsme se na sobě dopustili sami.
    -- Francois La Rochefoucauld
    Nabídnout přátelství tomu, kdo chce lásku, je jako dát chleba tomu, kdo umírá žízní.

  7. #7

    Standardní Re: My SQL - GROUP BY

    Huráá, díky, pořádně jsem se tedy ještě jednou zamysla, jak dostat ty dva sloupce takhle vedle sebe a přišla jsem na následovné:

    sselect COUNT(case when (m.hodnota > 120 and l.hodnota > 35 ) then 'ok' END) as prekrocilo, COUNT(*) as vsechny, m.datum FROM Mereni m JOIN Mereni l on m.intuns_a = l.intuns_b where m.idTyp =5 and l.idTyp = 6 and m.datum= l.datum and l.intuns_a IN (25372, 29747) and m.intuns_b = 128 and m.intuns_c = 84 and m.intuns_e = 2 and m.platne = 1 and l.platne = 1 group by m.datum order by m.datum limit 0,500


    výsledek:

    prekrocilo vsechny datum
    53 105 2002-00-00
    61 77 2003-00-00
    50 76 2004-00-00
    68 94 2005-00-00
    88 95 2006-00-00
    36 77 2008-00-00

    Asi to není moc srozumitelné, ale spíš, než to popsat bylo jednoduchší se nad tím zamyslet ještě jednou a z gruntu. Prostě jsem podmínky přesunula do části select pomocí case a tabulku jsem tím nechala celou a pracovala jenom s ní jedinou.

    Ještě přijít na to, proč tam nemám rok 2007 a je to geniální . Naše databáze není nic moc.. ani moje znalosti vlastně

    Dík za čas.

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Podobná témata

  1. MS Visio export pro MS SQL server
    Založil Commander v sekci fóra Programy a problémy s nimi
    Odpovědí: 0
    Poslední příspěvek: 22.02.2007, 11:58
  2. MS SQL a GROUP BY
    Založil xkrchnav v sekci fóra Programování
    Odpovědí: 1
    Poslední příspěvek: 23.01.2006, 15:45
  3. Reklamacni rad - softcom
    Založil Jezevec v sekci fóra Reklamace a §
    Odpovědí: 2
    Poslední příspěvek: 24.05.2005, 14:50
  4. SQL. Databaza na WZ.CZ
    Založil cd-mann v sekci fóra Programování
    Odpovědí: 3
    Poslední příspěvek: 14.11.2003, 10:31

Klíčová slova k tématu

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •