Autor Téma: Úloha: Výsledková listina súťaže družstiev  (Přečteno 5115 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Access 2003. Nie je to školská úloha. Školy mám dávno za sebou.

Súťaž má 9 kôl - konkrétne čísla sú iba kvôli zjednodušeniu a predídeniu nedorozumení
Je tam neznámy počet klubov s neznámym počtom družstiev. Pre riešenie berieme do úvahy iba družstvá.

Družstvo má najviac 5 členov

Celkové znenie úlohy:
Do výsledkovej listiny sa
  - posledné kolo započítava 2x
  - pre každé družstvo
    - započítava 7 najlepších kôl
    - započítavajú 4 najlepšie výsledky členov v kole

Úloha č. 1
  Vyberte pre každé kolo a družstvo 4 členov/skóre s najvyšším skóre.

Pomocou jednoduchého "Top 4" to nejde. Viem vybrať len všetky s patričným zoradením.

Pre ilustráciu viď prílohu. V zostave to budem mať z priestorových dôvodov na 2x.
V prvej časti výsledky družstiev
V druhej časti výsledky jednotlivcov.

Poznámka: ďalšie úlohy budem pridávať podľa potreby.
« Poslední změna: 26-03-2014, 13:32:44 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 30
    • Verze Delphi: 7, 2009, XE3
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #1 kdy: 26-03-2014, 12:27:00 »
Zkus nám pomoct tím, že vytvoříš schema své DB v SQLFiddle, třeba pro SQL Server. Ušetříš tím čas a miliony životů :)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #2 kdy: 26-03-2014, 13:02:06 »
Citace
Zkus nám pomoct tím, že vytvoříš schema své DB
To by naozaj len plietlo. Kľudne si vymyslite vlastný zdroj údajov/príklad.
Stačí mi to vo všeobecnej rovine.

Ináč mám dotazy kde sú
  - AllScore zoradené všetky výsledky daného kola
  - IDTeams kde sú IDTeams, ktoré sú v súťaži

Momentálne som skúsil toto
Kód: SQL [Vybrat]
  1. SELECT IDTeams.FKTeams AS FK, AllScore.score AS Výraz1
  2. FROM IDTeams INNER JOIN (SELECT top 4 score, FKTeams
  3. FROM AllScore
  4. WHERE FKTeams =  FK)  AS top4 ON IDTeams.FKTeams = top4.FKTeams;
Problém je, že nemám naplnenú  hodnotu FK. Niečo také si hmlisto pamätám, ale vyhľadávanie neporadilo.

Ja to vidím takto
V "cykle" volať SELECT TOP 4 ... Where IDTeams = xy
Ten cyklus si predstavujem ako ďalší SELECT, ktorý bude posielať hodnoty xy.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 30
    • Verze Delphi: 7, 2009, XE3
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #3 kdy: 26-03-2014, 13:12:39 »
Citace
Zkus nám pomoct tím, že vytvoříš schema své DB
To by naozaj len plietlo. Kľudne si vymyslite vlastný zdroj údajov/príklad.

Tak tady bych se pozastavil. Pokud to schema vytvoříš pro svou sérii otázek, pak:

 - je to jednorázová záležitost pro celou sérii
 - nepletlo, naopak bychom hned věděli co chceš vlastně dotazem získat
 - SQL dotaz si můžeš rovnou i vyzkoušet - i my si ho můžeme vyzkoušet, pokud tabulky naplníš daty
 - nemusíš složitě přemýšlet, jaký je význam sloupců a tabulek v našem vymyšleném schematu oproti tvému reálnému
 - ušetříš nám čas - proč bychom měli být my ti, co si mají tvořit schema - co když někdo špatně vyčte tvé myšlenky a vytvoří ho špatně ?
 - pro tebe je to otázka vygenerování DDL pro vytvoření tabulky a pastnutí do SQLFiddle - s malými úpravami, protože neopdporuje Access, ale i tak

Teď jsi napsal:

Ináč mám dotazy kde sú
  - AllScore zoradené všetky výsledky daného kola
  - IDTeams kde sú IDTeams, ktoré sú v súťaži

Momentálne som skúsil toto
Kód: SQL [Vybrat]
  1. SELECT IDTeams.FKTeams AS FK, AllScore.score AS Výraz1
  2. FROM IDTeams INNER JOIN (SELECT top 4 score, FKTeams
  3. FROM AllScore
  4. WHERE FKTeams =  FK)  AS top4 ON IDTeams.FKTeams = top4.FKTeams;
Problém je, že nemám naplnenú  hodnotu FK. Niečo také si hmlisto pamätám, ale vyhľadávanie neporadilo.

Ja to vidím takto
V "cykle" volať SELECT TOP 4 ... Where IDTeams = xy
Ten cyklus si predstavujem ako ďalší SELECT, ktorý bude posielať hodnoty xy.

Promiň ale i kdy(ž)bych možná věděl jak poradit, nemám 2x chuť trávit čas reverse engineeringem nad tím, nad čím ten dotaz spouštíš.
« Poslední změna: 26-03-2014, 13:16:14 od TLama »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1754
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #4 kdy: 26-03-2014, 13:24:56 »
Promiň ale i kdy(ž)bych možná věděl jak poradit, nemám 2x chuť trávit čas reverse engineeringem nad tím, nad čím ten dotaz spouštíš.
Presne.

Pokud nekdo zada pomoc s SQL prikazem, mel by poskytnout script,  ktery zalozi  testovaci DB vcetne fixtures, aby bylo na cem problem resit. SQL Fiddle je na to vice nez vhodny nastroj.
« Poslední změna: 26-03-2014, 13:28:19 od pf1957 »

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #5 kdy: 26-03-2014, 13:30:09 »
Citace
Pokud nekdo zada pomoct s SQL prikazem, mel by poskytnout script,  ktery zalozi  testovaci DB vcetne fixtures, aby bylo na cem problem resit.
Už rozumiem o čo vám ide. Idem to skúsiť.

Teraz prikladám celú DB. To je najjednoduchšie
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 30
    • Verze Delphi: 7, 2009, XE3
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #6 kdy: 26-03-2014, 13:34:27 »
Teraz prikladám celú DB. To je najjednoduchšie

Není, protože bychom si museli vytvořit podmínky pro její provoz. Např. SQLFiddle nabízí možnost poslat odkaz na databázi vytvořenou online, kde můžeš i nasypat zkušební data.
Pak pošleš jen link a my, si můžeme hrát. Viz. např. http://sqlfiddle.com/#!6/dd1b9/1

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #7 kdy: 26-03-2014, 13:39:49 »
Citace
Není, protože bychom si museli vytvořit podmínky pro její provoz.
Je, ale myslel som tým seba  ;) Stačí mať Access 2003 alebo vyšší, čo u väčšiny z vás nie je DB  :(
Idem si pozrieť ten odkaz.

Dodatok: ja ten skript v Access-e nevytvorím 
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #8 kdy: 26-03-2014, 14:09:37 »
Vkladám tie dva Query, lebo nič iné neviem urobiť. Písať ručne skript určite nebudem. Osobne si myslím, že pre vás sú zaujímavé akurát vymenované polia.
Kód: SQL [Vybrat]
  1. Query AllScore
  2. SELECT Competitions.Title, Rounds.DateOfAction, Rounds.Title, Results.FKTeams, Teams.SerialNumber, Teams.Title, Results.Score
  3. FROM (Competitions INNER JOIN Rounds ON Competitions.IDCompetitions = Rounds.FKCompetitions) INNER JOIN (Results INNER JOIN Teams ON Results.FKTeams = Teams.IDTeams) ON Rounds.IDRounds = Results.FKRounds
  4. WHERE (((Competitions.IDCompetitions)=6))
  5. GROUP BY Competitions.Title, Rounds.DateOfAction, Rounds.Title, Results.FKTeams, Teams.SerialNumber, Teams.Title, Results.Score
  6. ORDER BY Rounds.DateOfAction, Results.FKTeams, Results.Score DESC;
  7.  
  8. Query IDTeams
  9. SELECT Competitions_Teams.FKTeams
  10. FROM (Competitions INNER JOIN Competitions_Clubs ON Competitions.IDCompetitions=Competitions_Clubs.FKCompetitions) INNER JOIN Competitions_Teams ON Competitions_Clubs.IDCompetitions_Clubs=Competitions_Teams.FKCompetitions_Clubs
  11. WHERE (((Competitions.IDCompetitions)=6));
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #9 kdy: 26-03-2014, 14:42:50 »
Skúsim to ináč. Mám
Kód: [Vybrat]
FKTeams | Score
1           90
1           85
1           80
1           75
1           70
2           90
2           85
2           80
3           90
3           85
3           75
3           70

a potrebujem

1           90
1           85
1           80
1           75
2           90
2           85
2           80
3           90
3           85
3           75
3           70
Jednoduchšie to už neviem.
« Poslední změna: 26-03-2014, 15:33:20 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #10 kdy: 27-03-2014, 11:16:55 »
Citace
Písať ručne skript určite nebudem.
Tak som si to urobil vo FB.

SET SQL DIALECT 3;

CREATE TABLE RESULTS (
    IDRESULTS  INTEGER NOT NULL,
    FKROUNDS   INTEGER NOT NULL,
    FKTEAMS    INTEGER NOT NULL,
    FKMEMBERS  INTEGER NOT NULL,
    SCORE      DECIMAL(15,2)
);

ALTER TABLE RESULTS ADD CONSTRAINT PK_RESULTS PRIMARY KEY (IDRESULTS);

Údaje sú v prílohe. Zvolil som excel "Results.xlsx" - prosím, zmeňte si koncovku. Z neho nie je problém urobiť si požadovaný export. Ešte raz:

Potrebujem v každom (pre každé) kole pre každé družstvo získať 4 členov s najvyšším skóre. V jednom prípade má družstvo len troch členov - 2 humenský. FKTEAMS = 2.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 30
    • Verze Delphi: 7, 2009, XE3
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #11 kdy: 27-03-2014, 11:47:43 »

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #12 kdy: 28-03-2014, 11:29:04 »
Pokiaľ nenájdem čosi v literatúre, tak to urobím nasledovne:

 - v DB viem získať X prvých záznamov
 - v Delphi viem vytvoriť patričné cykly a získať správne hodnoty pre podmienku SQL
 - výsledky si postupne "naskladám" do tabuľky
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #13 kdy: 20-06-2014, 08:39:13 »
Momentálne to mám v hlave takto:

1 - Do dočasnej tabuľky (RowMember, IDMember, Score...) zapíšem všetky výsledky pre danú súťaž s poľom RowMember = 0
2 - Pre každého člena očíslujem jeho záznamy v poli RowMember od 1 do JehoPočetZánamov od najlepšieho po najhorší výsledok
3 - Zostavím SQL kde bude WHERE RowMember <= PožadovanýPočetVýsledkov

Rozmýšľal som nad subselect-om a Top. Ale to sa podľa mňa nedá.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #14 kdy: 20-06-2014, 15:13:41 »
http://www.linuxsoft.cz/article.php?id_article=901   podívej se, jestli tebou používaná DB podporuje klauzuli limit

hu

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2760
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Úloha: Výsledková listina súťaže družstiev
« Odpověď #15 kdy: 20-06-2014, 16:11:06 »
Access to nemá.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: