+ Rispondi al Thread
Pagina 2 di 2 primaprima 12
Visualizzazione dei risultati da 11 a 16 su 16

Discussione: Query per estrapolare percentuale

  1. #11
    L'avatar di Diego1966
    Diego1966 non è in linea Scolaretto
    Luogo
    Palermo
    Post
    131
    purtroppo non funziona mi restituisce questo messaggio:

    codice:
    1 queries executed, 0 success, 1 errors, 0 warnings
    
    Query: CREATE TEMPORARY TABLE Espletate ( SELECT TblRichieste.IdCircoscrizione, COUNT(TblRichieste.IdRichiesta) As Espletate FROM TblRi...
    
    Error Code: 1064
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT
      TblCircoscrizioni.ID,
      TblCircoscrizioni.Circoscrizione,
      COUNT(Tb' at line 8
    
    Execution Time : 0 sec
    Transfer Time  : 0 sec
    Total Time     : 0 sec

    Che poi tradotto sarebbe:

    codice:
    1 query eseguite, 0 esito positivo, 1 errori, 0 avvisi
    
    Query: CREATE TABELLA TEMPORANEA Espletate (SELEZIONA TblRichieste.IdCircoscrizione, COUNT (TblRichieste.IdRichiesta) Come Espletate DA TblRi ...
    
    Codice errore: 1064
    Si è verificato un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'SELEZIONA
    ** TblCircoscrizioni.ID,
    ** TblCircoscrizioni.Circoscrizione,
    ** COUNT (Tb 'alla riga 8
    
    Tempo di esecuzione: 0 sec
    Tempo di trasferimento: 0 sec
    Tempo totale: 0 sec

  2. #12
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    286
    Ho ricontrollato e l'unica dimenticanza che ho commesso è nella sezione Group By. Dovrebbe essere:
    codice:
    GROUP BY TblCircoscrizioni.ID, TblCircoscrizioni.Circoscrizione, E.Espletate, Percentuale
    Nel Group By gli alias sono ammessi.

    P.S. Il fatto di indentare la query su tutte quelle righe, ti facilita anche il capire questo tipo di errori. Dato che il messaggio riporta chiaramente la riga 8, si può escludere a priori che il problema sia nella tabella temporanea.

  3. #13
    L'avatar di Diego1966
    Diego1966 non è in linea Scolaretto
    Luogo
    Palermo
    Post
    131
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Ho ricontrollato e l'unica dimenticanza che ho commesso è nella sezione Group By. Dovrebbe essere:
    codice:
    GROUP BY TblCircoscrizioni.ID, TblCircoscrizioni.Circoscrizione, E.Espletate, Percentuale
    Nel Group By gli alias sono ammessi.

    P.S. Il fatto di indentare la query su tutte quelle righe, ti facilita anche il capire questo tipo di errori. Dato che il messaggio riporta chiaramente la riga 8, si può escludere a priori che il problema sia nella tabella temporanea.
    No infatti nella prima parte non rileva errori, ma continua a darmi errore, inoltre ho notato che nella seconda query tu inserisci alla fine del group by anche la percentuale, ma all'inizio quando dichiari la select del raggruppamento, citi solo
    codice:
    SELECT
      TblCircoscrizioni.ID,
      TblCircoscrizioni.Circoscrizione,
    Manca la tabella temporanea Espletate, ed alla fine la metti insieme a Percentuale che non fa parte dell'aggregazione.

    io ho fatto tutte le prove con Espletate in alto come gruppo di aggregazione ed ovviamente alla fine del group by, ho aggiunto anche Percentuale subito dopo Espletate nel group by, ma continua a darmi errore sempre alla riga 8

  4. #14
    L'avatar di Diego1966
    Diego1966 non è in linea Scolaretto
    Luogo
    Palermo
    Post
    131
    Ho implementato la query precedente con la funzione BETWEEN AND per le interrogazioni su data e funziona bene.

    codice:
    SELECT TblCircoscrizioni.ID, TblCircoscrizioni.Circoscrizione, 
    
    COUNT(TblRichieste.IdRichiesta) AS 'Ricevute',(SELECT COUNT(TblRichieste.IdRichiesta) FROM
    
    TblRichieste WHERE TblRichieste.Completata = TRUE 
    AND TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione 
    AND TblRichieste.DataRichiesta BETWEEN '2019-07-09' AND '2019-07-16') AS 'Espletate',
    
    ROUND((SELECT IF((SELECT COUNT(TblRichieste.IdRichiesta) FROM
    TblRichieste WHERE TblRichieste.Completata = TRUE 
    AND TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione)=0,0,(SELECT COUNT(TblRichieste.IdRichiesta) FROM
    TblRichieste WHERE TblRichieste.Completata = TRUE AND TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione)*100/(SELECT COUNT(TblRichieste.IdRichiesta) FROM
    TblRichieste WHERE TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione))),2 )AS Percentuale
    
    FROM TblCircoscrizioni LEFT JOIN TblRichieste ON TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione WHERE TblRichieste.DataRichiesta BETWEEN '2019-07-09' AND '2019-07-16'
    GROUP BY TblCircoscrizioni.ID, TblCircoscrizioni.Circoscrizione;


    Rettifico, la query di cui siopra mi restituiva percentuali sbagliate perchè il parametro BETWEEN AND non lo includevo in tutti i WHERE.
    Questa è LA query corretta dove le percentuali sono giuste.

    codice:
    SELECT TblCircoscrizioni.ID, TblCircoscrizioni.Circoscrizione, COUNT(TblRichieste.IdRichiesta) AS 'Ricevute',(SELECT COUNT(TblRichieste.IdRichiesta) FROM
    TblRichieste WHERE TblRichieste.Completata = TRUE AND TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione 
    AND TblRichieste.DataRichiesta BETWEEN '2019-07-09' AND '2019-07-16') AS 'Espletate',
    
    CONCAT(ROUND((SELECT IF((SELECT COUNT(TblRichieste.IdRichiesta) FROM
    TblRichieste WHERE TblRichieste.Completata = TRUE AND TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione 
    AND TblRichieste.DataRichiesta BETWEEN '2019-07-09' AND '2019-07-16')=0,0,(SELECT COUNT(TblRichieste.IdRichiesta) FROM
    TblRichieste WHERE TblRichieste.Completata = TRUE AND TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione 
    AND TblRichieste.DataRichiesta BETWEEN '2019-07-09' AND '2019-07-16')*100/(SELECT COUNT(TblRichieste.IdRichiesta) FROM
    TblRichieste WHERE TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione 
    AND TblRichieste.DataRichiesta BETWEEN '2019-07-09' AND '2019-07-16' ))),2),' %') AS Percentuale
    
    FROM TblCircoscrizioni LEFT JOIN TblRichieste ON TblCircoscrizioni.ID = TblRichieste.IdCircoscrizione 
    WHERE TblRichieste.DataRichiesta BETWEEN '2019-07-09' AND '2019-07-16'
    GROUP BY TblCircoscrizioni.ID, TblCircoscrizioni.Circoscrizione;
    Ultima modifica di Diego1966; 31-07-2019 19:54 

  5. #15
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    286
    Scusa il ritardo nella risposta:
    Sono riuscito a risolvere la questione. Il problema era a livello sintattico: è obbligatorio il punto e virgola alla fine della definizione della tabella temporanea. La query che suggerivo io risulta così:
    codice:
    SET @DataInizio = '20190709';
    SET @DataFine = '20190716';
    CREATE TEMPORARY TABLE IF NOT EXISTS Espletate
    (
      SELECT TblRichieste.IdCircoscrizione, COUNT(TblRichieste.IdRichiesta) As Espletate
      FROM TblRichieste
      WHERE TblRichieste.Completata = TRUE And tblrichieste.datarichiesta BETWEEN @Datainizio And @DataFine
      GROUP BY TblRichieste.IdCircoscrizione
    );
    SELECT 
      TblCircoscrizioni.Id,
      TblCircoscrizioni.Circoscrizione,
      COUNT(TblRichieste.IdRichiesta) AS Ricevute,
      E.Espletate,
      IF(COUNT(TblRichieste.IdRichiesta)=0,0,ROUND(E.Espletate/COUNT(TblRichieste.IdRichiesta)*100,2)) AS Percentuale
    FROM TblCircoscrizioni
      LEFT JOIN TblRichieste ON TblCircoscrizioni.Id = TblRichieste.IdCircoscrizione
      LEFT JOIN Espletate as E On E.IdCircoscrizione = TblRichieste.IdCircoscrizione
    WHERE (tblrichieste.datarichiesta BETWEEN @Datainizio And @DataFine) OR tblrichieste.datarichiesta is null
    GROUP BY TblCircoscrizioni.Id, TblCircoscrizioni.Circoscrizione, E.Espletate;
    Ne ho approfittato per includere anche la dichiarazione di due variabili in cui inserire le date che fungono da filtro, così le imposti una volta e valgono per l'intera query. Nella seconda parte della query ho aggiunto anche la condizione [OR tblrichieste.datarichiesta is null] a causa del Left Join. Se non ci sono richieste per quella circoscrizione, inserisce il valore NULL e così le includi nel risultato finale.

    Visto che la tua funziona, vedi questo mio post come spunto di riflessione per approfondire certi argomenti che, se padroneggiati, ti semplificano la vita non di poco.

  6. #16
    L'avatar di Diego1966
    Diego1966 non è in linea Scolaretto
    Luogo
    Palermo
    Post
    131
    Che dirti, ma davvero grazie, poco codice risultato identico, e più veloce nell'esecuzione, ho davvero tanto da imparare e voglio ringraziarti soprattutto per la tua pazienza e disponibilità.
    Ti auguro un buon fine settimana.

+ Rispondi al Thread
Pagina 2 di 2 primaprima 12

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi