🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #195115

Re: [mysql] Łączenie danych z wielu tabel

#195115
From: geos
Date: Mon, 17 Oct 2016 20:38
54 lines
3500 bytes
On 17.10.2016 20:02, kamil.sobczyk@gmail.com wrote:

> Szukam pomocy w stworzeniu zapytania SQL (mysql) zwracającego dla grupy wiekowej 11 lat (pole w tabeli **Klub**) w roku 2012 i kwartale 3 coś na podobieństwo:
>
> ||=id_zawodnik||id_szkolka||grupa_wiekowa||rok||kwartal||punkty_b5||punty_b10||punkty_30||SUMA
> ||1||2||11||2012||3||null||20||5||25
> ||2||2||11||2012||3||null||null||5||5
> ||3||2||11||2012||3||15||20||5||40
> ||4||2||11||2012||3||null||null||null||0
>
> oraz zapytania zwracającego wszelkie dostępne daty (rok, kwartal) jakie występują w tabelach **BIEG5**, **BIEG10**, **BIEG30** ?
>
> Będę wdzięczny za wszelką pomoc.

tak na pierwszy rzut oka to trochę nieintuicyjnie sobie zaprojektowałeś 
te biegi. czemu trzy osobne tabele a nie jedna z kolumną np. dystans o 
wartościach 5, 10, 30 (czy jakie tam kiedyś w przyszłości dodatkowe 
będą)? albo jedna partycjonowana po tej kolumnie jeśli zależy Ci na 
osobnych segmentach danych.

wracając do pytania - spróbuj napisać sobie taki widok w mysql:

select
   b.dst, b.idz, b.idsz, k.gw, b.rok, b.kw
, max(case when dystans = 5 then punkty end) p5
, max(case when dystans = 10 then punkty end) p10
, max(case when dystans = 30 then punkty end) p30
from
( select idz, idsz, rok, kw, punkty_5 pkt, 5 dst from bieg5 union all
   select idz, idsz, rok, kw, punkty_10 pkt, 10 dst from bieg10 union all
   select idz, idsz, rok, kw, punkty_30 pkt, 30 dst from bieg30 ) b
left join klub k on b.idk = k.idk
left join zawodnik z on b.idz = z.idz
group by b.dst, b.idz, b.idsz, k.gw, b.rok, b.kw
;

i dalej z tego widoku odpytuj o rok, kwartał czy co tam chcesz. a jak 
nie chcesz widoku to dodaj pożądane warunki do tego zapytania powyżej. 
sumę też możesz obliczać albo w zapytaniu do widoku albo w definicji widoku.

wygląda na to, że start zawodnika ze szkółki w biegu X jest raz na 
kwartał. nie wnikam dalej w to, ale jeśli jest inaczej to ten max 
oczywiście nie zadziała, potrzebna byłaby dodatkowa kolumna np. 
numer_startu.

ewentualnie jeśli mysql obsługuje pivot to możesz skorzystać z pivota.

jeśli chodzi o dostępne kombinacje rok/kwartał to wykorzystaj fragment 
"b" powyżej, zamień union all na union i usuń kolumny poza rok i kw.

łubu dubu, łubu dubu, niech nam żyje prezes klubu!

pozdrawiam
geos
Technical Details
Message-ID: <580536ce$0$5152$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin1!goblin.stu.neva.ru!peer04.fr7!futter-mich.highwinds-media.com!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <f97272db-262f-4f16-912e-f32dacc7518b@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin1!goblin.stu.neva.ru!peer04.fr7!futter-mich.highwinds-media.com!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
From: geos <geos@SPAMPRECZ.autograf.pl>
Subject: Re: [mysql] Łączenie danych z wielu tabel
Newsgroups: pl.comp.bazy-danych
References: <f97272db-262f-4f16-912e-f32dacc7518b@googlegroups.com>
X-Mozilla-News-Host: news://ssl.astraweb.com
Date: Mon, 17 Oct 2016 22:38:38 +0200
MIME-Version: 1.0
In-Reply-To: <f97272db-262f-4f16-912e-f32dacc7518b@googlegroups.com>
Lines: 55
Message-ID: <580536ce$0$5152$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 093105185217.warszawa.vectranet.pl
X-Trace: 1476736718 unt-rea-a-01.news.neostrada.pl 5152 93.105.185.217:55375
X-Complaints-To: abuse@news.neostrada.pl
X-Received-Bytes: 3232
X-Received-Body-CRC: 2783114597
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit