Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    35

    Classifica generale con divisione dei punti

    Ciao a tutti! A seguito di questo topic (https://forum.html.it/forum/showthre...readid=2971379) ho la necessità di unire con un unica query una classifica generale dove mi faccia due colonne con i campionati che avevano due punti a vittoria e quelli che attualmente hanno 3 punti a vittoria.
    Attualmente non riesco a implementare il codice in questo forum quindi allego file txt per visionare la query. Quella generale su cui sto lavorando è lo zip "query generale".

    ho cercato di differenziare con la funzione SUM() etichettandole con nomi diversi per poi nella sottoquery richiamandoli e fare un WHERE con l'id_stagione dove sono i campionati non i punti vittoria differenti, mi sembra giusto a logica, però MYsql mi da errore: #1054 - Unknown column 'punteggio3' in 'field list'

    Però credo siano dichiarata la colonna... mmm
    Grazie a tutti per l'aiuto

    Tiziano
    File allegati File allegati

  2. #2
    ha ragione mysql. quando usi una UNION e vuoi campi dai nomi diversi non puoi fare

    SELECT campo1 FROM tab1
    UNION
    SELECT campo2 FROM tab2

    ma - pensando a valori numerici

    SELECT SUM(campo1) as campo1, SUM(campo2) as campo2 FROM
    (
    SELECT campo1, 0 FROM tab1
    UNION
    SELECT 0, campo2 FROM tab2
    )

    adegua quindi la tua query

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    35
    Ciao Optime, mysql ha sempre ragione ok, ci ragiono un po' sulla tua risposta e poi ti faccio sapere...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    35
    Quote Originariamente inviata da optime Visualizza il messaggio
    ha ragione mysql. quando usi una UNION e vuoi campi dai nomi diversi non puoi fare

    SELECT campo1 FROM tab1
    UNION
    SELECT campo2 FROM tab2

    ma - pensando a valori numerici

    SELECT SUM(campo1) as campo1, SUM(campo2) as campo2 FROM
    (
    SELECT campo1, 0 FROM tab1
    UNION
    SELECT 0, campo2 FROM tab2
    )

    adegua quindi la tua query
    Ciao Optime! Mmm mi sa che avrò bisogno di una spiegazione un po' più approfondita, guarda, ho modificato la query ma non sono riuscito ad arrivare al risultato che vorrei, ora mi funziona correttamente ma mi ha sommato nella colonna "punteggio" i punti di tutte le stagioni che hanno i 2 punti a vittoria e le altre stagioni che hanno i 3 punti.

    Ti allego il file txt...
    File allegati File allegati

  5. #5
    non capisco la query, le UNION sembrano tutte uguali...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    35
    Quote Originariamente inviata da optime Visualizza il messaggio
    non capisco la query, le UNION sembrano tutte uguali...
    Ok, ripartiamo da capo , allora le tabelle dove recupera i dati questa ENORME query è così:
    codice:
    --
    -- Dumping data for table `partite_SerieA`
    --
    
    INSERT INTO `partite_SerieA` (`id_partita`, `sq_casa`, `sq_osp`, `gol_sq_casa_and`, `gol_sq_osp_and`, `gol_sq_casa_rit`, `gol_sq_osp_rit`, `id_giornata_and`, `id_giornata_rit`, `id_stagione`) VALUES
    (20, 52, 46, '3', '2', '1', '2', 3, 20, 1),
    (19, 72, 64, '2', '1', '2', '2', 3, 20, 1),
    (18, 66, 46, '3', '1', '0', '1', 2, 19, 1),
    (17, 70, 30, '9', '0', '0', '1', 2, 19, 1),
    (16, 5, 72, '1', '0', '0', '4', 2, 19, 1),
    ecc...


    Con una JOIN a questa tabella per recuperare i nomi delle squadre:
    codice:
    --
    -- Dumping data for table `squadre_SerieA`
    --
    
    INSERT INTO `squadre_SerieA` (`id_squadra`, `nome_squadra`, `scudetti`) VALUES
    (1, 'Alessandria', 0),
    (4, 'Pro Patria', 0),
    (5, 'Pro Vercelli', 7),
    (63, 'Sampdoria', 1),
    (10, 'Treviso', 0),
    (11, 'Pistoiese', 0),
    (12, 'Carpi', 0),
    ecc...


    
questa parte somma i punteggi, i pareggi, le partite, le sconfitte, i gol fatti e subiti, e poi fa una differenza tra i fatti e subiti per avere la differenza reti. Nella funzione IF() mi differenzia il punteggio se sono 2 punti a vittoria o 3 punti a vittoria con l'alias AS "vit_2p" e "vit_3p".
    


    codice:
    

    SELECT squadra,nome_squadra,

    SUM(if(fatti!='',1,0)) AS partite,

    SUM(if(punteggio=2,1,0)) AS vit_2p,
    SUM(if(punteggio=3,1,0)) AS vit_3p,
    SUM(if(punteggio=1,1,0)) AS pareggi,
    SUM(if(punteggio=0 AND fatti!= '',1,0)) AS sconfitte,

    SUM(punteggio) AS punteggio,

    SUM(fatti) AS fatti,

    SUM(subiti) AS subiti,

    SUM(fatti)-SUM(subiti) AS diff_reti

    FROM...
    

    





    Questa prima SELECT recupera i dati dalla tabella spiegata sopra e fa i confronti con il comando CASE per determinare i punteggi. Il comendo WHERE filtra l'id_stagione minore di 63 che sono le stagioni con i 2 punti.
    codice:
    SELECT sq_casa AS squadra, gol_sq_casa_and AS fatti, gol_sq_osp_and AS subiti,
                    CASE
                    WHEN gol_sq_casa_and > gol_sq_osp_and THEN 2
                    WHEN gol_sq_casa_and = gol_sq_osp_and AND gol_sq_casa_and <> '' THEN 1
                    ELSE 0
                    END AS punteggio
                    FROM partite_SerieA WHERE id_stagione < '63'
                    UNION ALL
                    SELECT sq_osp AS squadra, gol_sq_osp_and AS fatti, gol_sq_casa_and AS subiti,
                    CASE
                    WHEN gol_sq_osp_and > gol_sq_casa_and THEN 2
                    WHEN gol_sq_osp_and = gol_sq_casa_and AND gol_sq_osp_and <> '' THEN 1
                    ELSE 0
                    END AS punteggio
                    FROM partite_SerieA WHERE id_stagione < '63'
                    UNION ALL
                    SELECT sq_casa AS squadra, gol_sq_casa_rit AS fatti, gol_sq_osp_rit AS subiti,
                    CASE
                    WHEN gol_sq_casa_rit > gol_sq_osp_rit THEN 2
                    WHEN gol_sq_casa_rit = gol_sq_osp_rit AND gol_sq_casa_rit <> '' THEN 1
                    ELSE 0
                    END AS punteggio
                    FROM partite_SerieA WHERE id_stagione < '63'
                    UNION ALL
                    SELECT sq_osp AS squadra, gol_sq_osp_rit AS fatti, gol_sq_casa_rit AS subiti,
                    CASE
                    WHEN gol_sq_osp_rit > gol_sq_casa_rit THEN 2
                    WHEN gol_sq_osp_rit = gol_sq_casa_rit AND gol_sq_osp_rit <> '' THEN 1
                    ELSE 0
                    END AS punteggio
                    FROM partite_SerieA WHERE id_stagione < '63'


    Questa seconda SELECT fa la stessa cosa ma con WHERE filtra l'id_stagione >= 63 che sono i campionati con i 3 punti.
    codice:
    SELECT sq_casa AS squadra, gol_sq_casa_and AS fatti, gol_sq_osp_and AS subiti, 
                    CASE
                    WHEN gol_sq_casa_and > gol_sq_osp_and THEN 3
                    WHEN gol_sq_casa_and = gol_sq_osp_and AND gol_sq_casa_and <> '' THEN 1
                    ELSE 0
                    END AS punteggio
                    FROM partite_SerieA WHERE id_stagione >= '63'
                    UNION ALL
                    SELECT sq_osp AS squadra, gol_sq_osp_and AS fatti, gol_sq_casa_and AS subiti,
                    CASE
                    WHEN gol_sq_osp_and > gol_sq_casa_and THEN 3
                    WHEN gol_sq_osp_and = gol_sq_casa_and AND gol_sq_osp_and <> '' THEN 1
                    ELSE 0
                    END AS punteggio
                    FROM partite_SerieA WHERE id_stagione >= '63'
                    UNION ALL
                    SELECT sq_casa AS squadra, gol_sq_casa_rit AS fatti, gol_sq_osp_rit AS subiti,
                    CASE
                    WHEN gol_sq_casa_rit > gol_sq_osp_rit THEN 3
                    WHEN gol_sq_casa_rit = gol_sq_osp_rit AND gol_sq_casa_rit <> '' THEN 1
                    ELSE 0
                    END AS punteggio
                    FROM partite_SerieA WHERE id_stagione >= '63'
                    UNION ALL
                    SELECT sq_osp AS squadra, gol_sq_osp_rit AS fatti, gol_sq_casa_rit AS subiti,
                    CASE
                    WHEN gol_sq_osp_rit > gol_sq_casa_rit THEN 3
                    WHEN gol_sq_osp_rit = gol_sq_casa_rit AND gol_sq_osp_rit <> '' THEN 1
                    ELSE 0
                    END AS punteggio
                    FROM partite_SerieA WHERE id_stagione >= '63'


    L'ultima parte fa la JOIN con la tebella per recuperare i nomi delle squadre, li raggruppa e li ordina con il punteggio TOTALE più alto, la differenza reti, i gol fatti, e alla fine il nome della squadra.
    codice:
    JOIN squadre_SerieA ON squadra=squadre_SerieA.id_squadra
                    GROUP BY squadra
                    ORDER BY punteggio DESC, diff_reti DESC, fatti DESC, nome_squadra


    Ecco, la query in sè funziona bene e calcola tutto correttamente, il problema sorge quando voglio differenziare due colonne con i punteggi dei campionati da 2 punti e quelli con i 3 punti a vittoria, perchè ora il campo "punteggio" è il totale. Come posso dividere le cose?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    35
    Up che non ha preso la mia risposta....

  8. #8
    SELECT sq_casa AS squadra, gol_sq_casa_and AS fatti, gol_sq_osp_and AS subiti,
    CASE (tutti!) ..... AS punteggiopre63,
    0 AS punteggiopost63

    UNION

    SELECT sq_casa AS squadra, gol_sq_casa_and AS fatti, gol_sq_osp_and AS subiti,
    0 AS punteggiopre63,
    CASE (tutti!) ..... AS punteggiopost63

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    35
    Quote Originariamente inviata da optime Visualizza il messaggio
    SELECT sq_casa AS squadra, gol_sq_casa_and AS fatti, gol_sq_osp_and AS subiti,
    CASE (tutti!) ..... AS punteggiopre63,
    0 AS punteggiopost63

    UNION

    SELECT sq_casa AS squadra, gol_sq_casa_and AS fatti, gol_sq_osp_and AS subiti,
    0 AS punteggiopre63,
    CASE (tutti!) ..... AS punteggiopost63
    Ciao Optime, scusami, non ho capito bene la tua risposta, puoi essere più preciso?

  10. #10
    cosa non hai capito? non vorrei scriverti io tutta la query se vuoi, qui https://lnx.dicesare.com/sql/sql-com...-di-risultati/ un po' di "teoria"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.