<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=%2FCw14</id>
	<title>/Cw14 - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=%2FCw14"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/Cw14&amp;action=history"/>
	<updated>2026-04-17T07:17:52Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=/Cw14&amp;diff=2055&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;= TI:WTBD/Ćwiczenia 14 = == Sprawdzian 2 - SQL. == === Grupa 1 ===  Plik Pl_lud_2010.txt zawiera dane o ludności Polski (wg. GUS) na koni...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/Cw14&amp;diff=2055&amp;oldid=prev"/>
		<updated>2015-05-23T15:06:57Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;= &lt;a href=&quot;/edu/index.php/TI:WTBD&quot; title=&quot;TI:WTBD&quot;&gt;TI:WTBD&lt;/a&gt;/Ćwiczenia 14 = == Sprawdzian 2 - SQL. == === Grupa 1 ===  Plik &lt;a href=&quot;/edu/images/3/39/Pl_lud_2010.txt&quot; class=&quot;internal&quot; title=&quot;Pl lud 2010.txt&quot;&gt;Pl_lud_2010.txt&lt;/a&gt; zawiera dane o ludności Polski (wg. GUS) na koni...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= [[TI:WTBD]]/Ćwiczenia 14 =&lt;br /&gt;
== Sprawdzian 2 - SQL. ==&lt;br /&gt;
=== Grupa 1 ===&lt;br /&gt;
&lt;br /&gt;
Plik [[media:Pl_lud_2010.txt|Pl_lud_2010.txt]] zawiera dane o ludności Polski (wg. GUS) na koniec 2010 r., w rozbiciu na powiaty. Dane powiatów pogrupowane są w bloki, odpowiadające województwom, do których należą.&lt;br /&gt;
&lt;br /&gt;
1. Proszę napisac program, który na podstawie tego pliku tworzy bazę SQLite z tabelą POWIATY i tabelą WOJEWODZTWA, wraz ze związkiem opisującym przynależność każdego powiatu do jednego z województw, oraz informacją o populacji każdego z powiatów.&lt;br /&gt;
&lt;br /&gt;
2. Napisać zapytania SQL odpowiadające na pytania:&lt;br /&gt;
&lt;br /&gt;
a) ile wynosiła populacja najbardziej i najmniej ludnego z województw (oraz jakie były ich nazwy)&lt;br /&gt;
&lt;br /&gt;
b) dla każdego województwa, ile wynosiła średnia liczba ludności dla jego powiatów&lt;br /&gt;
&lt;br /&gt;
c) ile wynosił stosunek ludności powiatów miejskich (grodzkich; tj. nazwanych nazwą miasta) do całkowitej ludności Polski&lt;br /&gt;
&lt;br /&gt;
3. Włączyć te zapytania do powyższego programu jako wykonywane w zależności od argumentu wywołania&lt;br /&gt;
&lt;br /&gt;
Wynikiem powinien być pojedynczy plik 'ludnosc.py', którego wywołanie z argumentem ''create'' tworzy i wypełnia tabele, a z argumentami ''q1'', ''q2'' i ''q3'' podaje odpowiednio wyniki zapytania a), b) i c).&lt;br /&gt;
&lt;br /&gt;
=== przykład rozwiązania dla zadania gr. 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
# coding: utf-8&lt;br /&gt;
&lt;br /&gt;
DEF_TABEL = ('''&lt;br /&gt;
    create table if not exists WOJEWODZTWA&lt;br /&gt;
        (ID int primary key, NAZWA)''',&lt;br /&gt;
    '''&lt;br /&gt;
    create table if not exists POWIATY&lt;br /&gt;
        (ID int primary key, NAZWA, W_ID references WOJEWODZTWA, LUDNOSC int)'''&lt;br /&gt;
    )  &lt;br /&gt;
&lt;br /&gt;
def wstaw_dane(conn, plik):&lt;br /&gt;
    lines = open(plik)&lt;br /&gt;
    w_id, p_id = 0, 0&lt;br /&gt;
    for l in lines:&lt;br /&gt;
        l = l.decode('utf-8')&lt;br /&gt;
        if not l.startswith(u'\t'):  # to jest nagłówek, początek danych dla kolejnego województwa&lt;br /&gt;
            w_id += 1&lt;br /&gt;
            w_nazwa = l.strip(u':\n')&lt;br /&gt;
            conn.execute('''&lt;br /&gt;
                insert into WOJEWODZTWA (ID, NAZWA) values (?,?)&lt;br /&gt;
                ''', (w_id, w_nazwa))&lt;br /&gt;
        else:      # to jest linijka opisująca powiat aktualnego województwa&lt;br /&gt;
            row = l.strip().split(u'|')&lt;br /&gt;
            if len(row) == 2:&lt;br /&gt;
                p_id += 1&lt;br /&gt;
                conn.execute('''&lt;br /&gt;
                    insert into POWIATY (ID, W_ID, NAZWA, LUDNOSC) values (?,?,?,?)&lt;br /&gt;
                ''', (p_id, w_id, row[0], int(row[1])))&lt;br /&gt;
    conn.commit()&lt;br /&gt;
    lines.close()&lt;br /&gt;
&lt;br /&gt;
QUERIES = (  '''select w.NAZWA, sum(p.LUDNOSC) as POPULACJA&lt;br /&gt;
                from WOJEWODZTWA w &lt;br /&gt;
                join POWIATY p on w.ID=p.W_ID&lt;br /&gt;
                group by w.NAZWA&lt;br /&gt;
                having POPULACJA=(&lt;br /&gt;
                    select sum(LUDNOSC)&lt;br /&gt;
                    from POWIATY&lt;br /&gt;
                    group by W_ID&lt;br /&gt;
                    order by sum(LUDNOSC) desc&lt;br /&gt;
                    limit 1)&lt;br /&gt;
                or POPULACJA=(&lt;br /&gt;
                    select sum(LUDNOSC)&lt;br /&gt;
                    from POWIATY&lt;br /&gt;
                    group by W_ID&lt;br /&gt;
                    order by sum(LUDNOSC) asc&lt;br /&gt;
                    limit 1)&lt;br /&gt;
                order by POPULACJA desc''', # zapytanie dla podpunktu a)&lt;br /&gt;
&lt;br /&gt;
             '''select w.NAZWA, sum(p.LUDNOSC)/count(*) as SREDNIA_POWIATU&lt;br /&gt;
                from WOJEWODZTWA w&lt;br /&gt;
                join POWIATY p on w.ID=p.W_ID&lt;br /&gt;
                group by w.NAZWA&lt;br /&gt;
                order by w.NAZWA&lt;br /&gt;
                ''',  # zapytanie dla podpunktu b)&lt;br /&gt;
&lt;br /&gt;
             '''select 1.*sum(p.LUDNOSC)/(select sum(LUDNOSC) from POWIATY) as ULAMEK_W_P_MIEJSKICH &lt;br /&gt;
                from POWIATY p&lt;br /&gt;
                where p.NAZWA like 'm. %' '''  # zapytanie dla podpunktu c)&lt;br /&gt;
          )&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    from sqlite3 import connect&lt;br /&gt;
    from sys import argv&lt;br /&gt;
    conn = connect('pl_lud.db')&lt;br /&gt;
    if argv[1] == 'create':&lt;br /&gt;
        for command in DEF_TABEL:&lt;br /&gt;
            print command&lt;br /&gt;
            conn.execute(command)&lt;br /&gt;
            print u'... wykonane'.encode('utf-8')&lt;br /&gt;
        wstaw_dane(conn, 'pl_lud_2010.txt')&lt;br /&gt;
    elif argv[1] == 'drop':&lt;br /&gt;
        conn.execute('drop table if exists POWIATY')&lt;br /&gt;
        conn.execute('drop table if exists WOJEWODZTWA')&lt;br /&gt;
    elif argv[1] in ('q1', 'q2', 'q3'):&lt;br /&gt;
        c = conn.execute(QUERIES[int(argv[1][1])-1])&lt;br /&gt;
        result = [list(x[0] for x in c.description)]&lt;br /&gt;
        result.extend(c.fetchall())&lt;br /&gt;
        for line in result: # nie silimy się na specjalnie wymyślną prezentację wyniku ..&lt;br /&gt;
            print u' | '.join(unicode(x) for x in line).encode('utf-8')&lt;br /&gt;
    else:&lt;br /&gt;
        print &amp;gt;&amp;gt; sys.stderr, u'Błędny argument.'.encode('utf-8')&lt;br /&gt;
    conn.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Grupa 2 ===&lt;br /&gt;
&lt;br /&gt;
Plik [[media:Pl_lud_2010.csv.txt|Pl_lud_2010.csv]] zawiera dane o ludności Polski (wg. GUS) na koniec 2010 r., w rozbiciu na powiaty. Linijki zaczynające się od '##' otwierają&lt;br /&gt;
bloki odpowiadające poszczególnym województwom.&lt;br /&gt;
&lt;br /&gt;
1. Proszę napisac program, który na podstawie tego pliku tworzy bazę SQLite z tabelą&lt;br /&gt;
POWIATY i tabelą WOJEWODZTWA, wraz ze związkiem opisującym przynależność&lt;br /&gt;
każdego powiatu do jednego z województw, oraz informacją o liczbie ludności&lt;br /&gt;
każdego z powiatów.&lt;br /&gt;
&lt;br /&gt;
2. Napisać zapytania SQL odpowiadające na pytania:&lt;br /&gt;
&lt;br /&gt;
a) ile wynosiła liczba ludności każdego z województw (w kolejności malejącej liczby)&lt;br /&gt;
&lt;br /&gt;
b) jaki był powiat o największej liczbie ludności w każdym z województw (jego nazwa&lt;br /&gt;
i liczba ludności) w kolejności alfabetycznej wg. nazw województw&lt;br /&gt;
&lt;br /&gt;
c) jaka część powiatów w kraju miała zaludnienie przekraczające średnią dla powiatu&lt;br /&gt;
w kraju&lt;br /&gt;
&lt;br /&gt;
3. Włączyć te zapytania do powyższego programu jako wykonywane w zależności&lt;br /&gt;
od argumentu wywołania&lt;br /&gt;
&lt;br /&gt;
Wynikiem powinien być pojedynczy plik 'ludnosc.py', którego wywołanie z argumentem&lt;br /&gt;
'create' tworzy i wypełnia tabele, a z argumentami 'q1', 'q2' i 'q3' podaje&lt;br /&gt;
odpowiednio wyniki zapytania a), b) i c).&lt;br /&gt;
&lt;br /&gt;
=== przykład rozwiązania dla gr. 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
# coding: utf-8&lt;br /&gt;
&lt;br /&gt;
DEF_TABEL = ('''&lt;br /&gt;
    create table if not exists WOJEWODZTWA&lt;br /&gt;
        (ID int primary key, NAZWA)''',&lt;br /&gt;
    '''&lt;br /&gt;
    create table if not exists POWIATY&lt;br /&gt;
        (ID int primary key, NAZWA, W_ID references WOJEWODZTWA, LUDNOSC int)'''&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
def wstaw_dane(conn, plik):&lt;br /&gt;
    lines = open(plik)&lt;br /&gt;
    w_id, p_id = 0, 0&lt;br /&gt;
    for l in lines:&lt;br /&gt;
        row = tuple(x.strip() for x in l.decode('utf-8').split(','))&lt;br /&gt;
        if row[0].startswith('##'):  # początek kolejnego województwa&lt;br /&gt;
            w_id += 1&lt;br /&gt;
            conn.execute('''&lt;br /&gt;
                insert into WOJEWODZTWA (ID, NAZWA) values (?,?)&lt;br /&gt;
                ''', (w_id,) + row[1:])&lt;br /&gt;
        else:   # kolejny powiat z aktualnego województwa&lt;br /&gt;
            p_id += 1&lt;br /&gt;
            conn.execute('''&lt;br /&gt;
                insert into POWIATY (ID, W_ID, NAZWA, LUDNOSC) values (?,?,?,?)&lt;br /&gt;
                ''', (p_id, w_id, row[0], int(row[1])))&lt;br /&gt;
    conn.commit()&lt;br /&gt;
    lines.close()&lt;br /&gt;
&lt;br /&gt;
QUERIES = ('''&lt;br /&gt;
    select w.NAZWA, sum(p.LUDNOSC) as SUMA_LUDNOSCI&lt;br /&gt;
    from POWIATY p join WOJEWODZTWA w on w.ID=p.W_ID&lt;br /&gt;
    group by w.NAZWA&lt;br /&gt;
    order by SUMA_LUDNOSCI desc''',  #  zapytanie dla podpunktu a)&lt;br /&gt;
&lt;br /&gt;
    '''&lt;br /&gt;
    select w.NAZWA as NAZWA_W, p.NAZWA as NAZWA_P, p.LUDNOSC as LUDNOSC_MAX&lt;br /&gt;
    from WOJEWODZTWA w join POWIATY p on w.ID=p.W_ID&lt;br /&gt;
    where p.LUDNOSC=(&lt;br /&gt;
        select max(LUDNOSC) from POWIATY where W_ID=w.ID)&lt;br /&gt;
    order by w.NAZWA;&lt;br /&gt;
    ''',    #  zapytanie dla podpunktu b)&lt;br /&gt;
&lt;br /&gt;
    '''&lt;br /&gt;
    select 1.*count(*)/(select count(*) from POWIATY) as DUZYCH_POWIATOW&lt;br /&gt;
    from POWIATY&lt;br /&gt;
    where LUDNOSC &amp;gt; (select sum(LUDNOSC)/count(*) from POWIATY)&lt;br /&gt;
    '''   #  zapytanie dla podpunktu c)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    from sqlite3 import connect&lt;br /&gt;
    from sys import argv&lt;br /&gt;
    conn = connect('pl_lud.db')&lt;br /&gt;
    if argv[1] == 'create':&lt;br /&gt;
        for command in DEF_TABEL:&lt;br /&gt;
            print command&lt;br /&gt;
            conn.execute(command)&lt;br /&gt;
        wstaw_dane(conn, 'pl_lud_2010_00_03.csv')&lt;br /&gt;
    elif argv[1] == 'drop':   # tego nie musiało być, ale się przydaje&lt;br /&gt;
        conn.execute('drop table if exists POWIATY')&lt;br /&gt;
        conn.execute('drop table if exists WOJEWODZTWA')&lt;br /&gt;
    elif argv[1] in ('q1', 'q2', 'q3'):&lt;br /&gt;
        c = conn.execute(QUERIES[int(argv[1][1])-1])&lt;br /&gt;
        result = [list(x[0] for x in c.description)]&lt;br /&gt;
        result.extend(c.fetchall())&lt;br /&gt;
        for line in result:   # nie silimy się nadmiernie w prezentacji wyniku ...&lt;br /&gt;
            print u' | '.join(unicode(x) for x in line).encode('utf-8')&lt;br /&gt;
    else:&lt;br /&gt;
        print &amp;gt;&amp;gt; sys.stderr, u'Błędny argument.'.encode('utf-8')&lt;br /&gt;
    conn.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>