[sql] query database mondial

di il
9 risposte

[sql] query database mondial

Mi date una mano a risolvere questa query?
Elencare le nazioni composte per almeno il 99% da isole (il risultato deve comprendere il nome della nazione, la sua superficie,
la superficie totale delle sue isole) (Suggerimento: prestare attenzione ai valori ottenuti per il Regno Unito perché potrebbe
essere un indizio di errori nella query) (scrivere due versioni della query)
in allegato vi metto il file con le referenze della tabella e se non dovesse bastare qui c'è tutto il dettaglio del DB Mondial http://www.dbis.informatik.uni-goettingen.de/Mondial
Allegati:
11269_77b25d63e327b6a64efd49a6630824cd.jpg
11269_77b25d63e327b6a64efd49a6630824cd.jpg

9 Risposte

  • Re: [sql] query database mondial

    Cosa ti turba?
  • Re: [sql] query database mondial

    +m+ ha scritto:


    cosa ti turba?
    select c.name, c.area, sum(i.area)
    from country as c inner join geo_island as gi on (c.code = gi.country) inner join island as i on (i.name = gi.island) 
    where (c.area * 0.99) >= (select sum(i.area) from island i1 inner join geo_island gi2 on (i1.name = gi2.island) where c.code = gi1.country group by gi1.country)
    group by c.code;
    La query mi restituisce questo errore:
    ERRORE: le funzioni di aggregazione non sono ammesse in WHERE
    LINE 3: where (c.area * 0.99) >= (select sum(i.area) from island i1 ...
    ^

    ********** Error **********

    ERRORE: le funzioni di aggregazione non sono ammesse in WHERE
    SQL state: 42803
    Character: 190

    sto usando postgress come db
  • Re: [sql] query database mondial

    Conminciamo per ordine: la query è sbagliata nella parte del join.
    guarda bene lo schemino e controlla le chiavi in particolare la chiave composta di geo_island
  • Re: [sql] query database mondial

    +m+ ha scritto:


    conminciamo per ordine: la query è sbagliata nella parte del join.
    guarda bene lo schemino e controlla le chiavi in particolare la chiave composta di geo_island
    ho rifatto la query ottenendo questa
    select c.name, c.area, ai.sum_area
    from country as c inner join (select sum(i.area) as sum_area, gi.country from island i inner join geo_island gi on (i.name = gi.island) group by gi.country) as ai on (c.code = ai.country)
    where (c.area * 0.99) <= ai.sum_area;
    il problema è che in alcune nazioni, la somma dell'area delle nazione è superiore all'area totale della nazione!
    infatti ecco i risultati:

    Nazione- Area - Somma delle isole

    "Guernsey";194;194
    "Iceland";103000;102829
    "Ireland";70280;84421
    "Jersey";117;117
    "Isle of Man";588;588
    "United Kingdom";244820;2622428.6
    "Bahrain";620;620
    "Brunei";5770;743122
    "Malaysia";329750;1486335
    "Christmas Island";135;135
    "Cyprus";9251;9251
    "Indonesia";1919440;10333702
    "Timor-Leste";15007;33850
    "Papua New Guinea";461690;794800
    "Japan";377835;8247391
    "Philippines";299764;1421325
    "Singapore";632.6;632.6
    "Sri Lanka";65610;65610
    "Antigua and Barbuda";442;442
    "Aruba";193;193
    "Barbados";430;430
    "Bermuda";53.3;53.3
    "Cuba";110860;1481284
    "Dominica";746;746
    "Dominican Republic";48730;76192
    "Haiti";27750;76192
    "Greenland";2175600;2175600
    "Grenada";344;344
    "Jamaica";10991;10991
    "Martinique";1128;1128
    "Montserrat";102;102
    "Curacao";444;444
    "Sint Maarten";34;87
    "Saint Martin";54;87
    "Saint Barthelemy";21;21
    "Puerto Rico";8870;8870
    "Saint Lucia";620;616
    "Trinidad and Tobago";5130;5128
    "Guam";541.3;541
    "Nauru";21;21
    "New Zealand";268680;266354
    "Niue";260;260
    "Samoa";2860;2832
    "Madagascar";587041;587041
    "Mayotte";374;374
    "Reunion";2510;2510
    "Sao Tome and Principe";1001;1001
  • Re: [sql] query database mondial

    Ribadisco: stai facendo join sbagliato.
    guarda bene lo schemino di geo_island
  • Re: [sql] query database mondial

    +m+ ha scritto:


    ribadisco: stai facendo join sbagliato.
    guarda bene lo schemino di geo_island
    Lo sto guardando, referenzia city e province, ma questi 2 campi come possono aiutarmi a svolegere la query? non ha molto senso...io semplicemnte dovrei fare la somma delle aree delle isole, e non capisco cosa abbiano a che fare le province e le città con l'area delle isole! quei campi in geo island non servono per identificare a quale provincia appartengono le loro isole e la città?
  • Re: [sql] query database mondial

    thaiboxer89 ha scritto:


    Lo sto guardando, referenzia city e province, ma questi 2 campi come possono aiutarmi a svolegere la query? non ha molto senso...
    Non ho disegnato io quel database.
    Il punto è: qual'è la chiave del join?
  • Re: [sql] query database mondial

    +m+ ha scritto:


    thaiboxer89 ha scritto:


    Lo sto guardando, referenzia city e province, ma questi 2 campi come possono aiutarmi a svolegere la query? non ha molto senso...
    Non ho disegnato io quel database.
    Il punto è: qual'è la chiave del join?
    ok, ho seguito lo schema e ho cambiato il join seguendo la referenze
    
    select c.name, c.area, ai.sum_area
    from country as c inner join 
    (select sum(i.area) as sum_area, gi.country,gi.province from island i inner join geo_island gi on (i.name = gi.island) 
    inner join province as provincia on (provincia.country = gi.country and provincia.name = gi.province) group by gi.country,gi.province) 
    as ai on (c.code = ai.country and c.province = ai.province)
    where (c.area * 0.99) <= ai.sum_area;
    
    come vedi ora il join è su province
    il problema è mostra lo stesso dei risultati sbagliati:
    ad esempio ora la gran bretagna non la mostra più (e non credo sia effetto brexit ) e in alcuni stati la somma risulta ancora maggiore
    "Guernsey";194;194
    "Iceland";103000;102829
    "Ireland";70280;84421
    "Jersey";117;117
    "Isle of Man";588;588
    "Bahrain";620;620
    "Brunei";5770;743122
    "Christmas Island";135;135
    "Cyprus";9251;9251
    "Timor-Leste";15007;33850
    "Papua New Guinea";461690;794800
    "Singapore";632.6;632.6
    "Sri Lanka";65610;65610
    "Antigua and Barbuda";442;442
    "Aruba";193;193
    "Barbados";430;430
    "Bermuda";53.3;53.3
    "Dominica";746;746
    "Dominican Republic";48730;76192
    "Haiti";27750;76192
    "Greenland";2175600;2175600
    "Grenada";344;344
    "Jamaica";10991;10991
    "Martinique";1128;1128
    "Montserrat";102;102
    "Curacao";444;444
    "Sint Maarten";34;87
    "Saint Martin";54;87
    "Saint Barthelemy";21;21
    "Puerto Rico";8870;8870
    "Saint Lucia";620;616
    "Trinidad and Tobago";5130;5128
    "Guam";541.3;541
    "Nauru";21;21
    "New Zealand";268680;266354
    "Niue";260;260
    "Samoa";2860;2832
    "Madagascar";587041;587041
    "Mayotte";374;374
    "Reunion";2510;2510
    "Sao Tome and Principe";1001;1001
  • Re: [sql] query database mondial

    Mah per me stai facendo un gran "casino".

    Lascia stare la somma, il 99% etc.
    Inizia con lo scrivere la query con il doppio join fatto bene (sulle chiavi composte giuste).
    Poi si inseriranno le funzioni di raggruppamento, ma non è che puoi "andare a casaccio", bisogna che la query abbia una sua logica e che, quindi, sia corretta per definizione.
Devi accedere o registrarti per scrivere nel forum
9 risposte