none
calcolo percentuale e Divide by zero error RRS feed

  • Domanda

  • Buona sera a tutti,
    ho questa query

    select PIAPROH.Settimana, IDGruppo, SUM(PIAPROH.TempoLavoroGiornata / 60) AS HD, 
           SUM(PIAPROH.TempoLavoroOccupato / 60) AS HO,
           (100 * SUM(PIAPROH.TempoLavoroOccupato / 60)) / SUM(PIAPROH.TempoLavoroGiornata / 60) AS PERC
    FROM PIAPROH
    WHERE PIAPROH.IDPIAPROT = 2
    AND PIAPROH.TempoLavoroGiornata > 0
    AND PIAPROH.IDGruppo in (120,39,36,23)
    GROUP BY PIAPROH.Settimana, PIAPROH.IDGruppo
    ORDER BY PIAPROH.Settimana, PIAPROH.IDGruppo

    Sarebbe possibile eseguire il test su TempoLavoroGiornata maggiore di zero direttamente nella select invece che nella where? Ho provato a cimentarmi con il case when ma senza successo :-(

    Grazie 1000.

    Beppe

    giovedì 23 novembre 2017 17:40

Risposte

Tutte le risposte

  • Come condizione del "where" imponi che sia HD >0
    venerdì 24 novembre 2017 12:13
  • per quale motivo ritieni che questo sia utile ?

    come ti hanno già detto altri devi postare i dati di esempio e il codice che hai provato a scrivere.


    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    lunedì 27 novembre 2017 15:36
    Moderatore
  • Buona sera a tutti,
    nel frattempo ho risolto il problema con il case when ma non riesco a sommare gruppi e settimane come vorrei.
    Ecco il codice che ho scritto corredato da istruzioni per creazione tabella e insert di qualche valore di esempio:

    CREATE TABLE PIAPROH (
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[IDPIAPROT] [int] NOT NULL,
    	[Settimana] [tinyint] NOT NULL,
    	[IDGruppo] [int] NOT NULL,
    	[TempoLavoroGiornata] [int],
    	[TempoLavoroOccupato] [int],
     CONSTRAINT [PIAPROH01] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY];
    
    GO
    
    INSERT INTO PIAPROH ([Settimana], [IDPIAPROT], [IDGruppo], [TempoLavoroGiornata], [TempoLavoroOccupato])
    VALUES	(40, 2, 120, 300, 250),
    		(40, 2, 39, 300, 200),
    		(40, 2, 36, 0, 0),
    		(40, 2, 36, 300, 300),
    		(40, 2, 23, 400, 395),
    		(41, 2, 120, 0, 0),
    		(41, 2, 39, 300, 289),
    		(41, 2, 36, 450, 306),
    		(41, 2, 23, 400, 355),
    		(42, 2, 120, 350, 99),
    		(42, 2, 39, 0, 0),
    		(42, 2, 39, 150, 100),
    		(42, 2, 36, 400, 300),
    		(42, 2, 23, 420, 420);
    
    SELECT PIAPROH.Settimana, IDGruppo, SUM(PIAPROH.TempoLavoroGiornata / 60) AS HD, 
           SUM(PIAPROH.TempoLavoroOccupato / 60) AS HO,
    	   PERC =
    	   CASE PIAPROH.TempoLavoroGiornata
    	   WHEN 0 THEN 0
    	   ELSE (100 * SUM(PIAPROH.TempoLavoroOccupato / 60)) / SUM(PIAPROH.TempoLavoroGiornata / 60)
    	   END
    FROM PIAPROH
    WHERE PIAPROH.IDPIAPROT = 2
    --AND PIAPROH.TempoLavoroGiornata > 0
    AND PIAPROH.IDGruppo in (120,39,36,23)
    GROUP BY PIAPROH.Settimana, PIAPROH.IDGruppo, PIAPROH.TempoLavoroGiornata
    ORDER BY PIAPROH.Settimana, PIAPROH.IDGruppo
    

    Come potrete notare non riesco a raggruppare le settimane che riportano più volte lo stesso gruppo poiché la select come l'ho fatta io mi costringe a porre la colonna TempoLavoroGiornata nella GROUP BY.

    Grazie 1000.

    Beppe

    lunedì 27 novembre 2017 21:56
  • per quale motivo ritieni che questo sia utile ?

    come ti hanno già detto altri devi postare i dati di esempio e il codice che hai provato a scrivere.


    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    Ciao Edoardo,
    mi è utile solo a scopo didattico.

    Buona serata.

    Beppe

    lunedì 27 novembre 2017 21:57
  • Certo che è possibile.

    Posta i tuoi tentativi e possibilmente uno script per creare la tua tabella con qualche dato.

    Ciao e grazie per la risposta.
    Ho postato quanto richiesto.

    Buona serata.

    Beppe

    lunedì 27 novembre 2017 21:58
  • rimango comunque perplesso anche se la motivazione è puramente didattica perchè la sintassi nel "where" è corretta visto che segue giustamente la select a cui il where si riferisce.

    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    martedì 28 novembre 2017 09:32
    Moderatore
  • Grazie Paperoga, perfetto!

    Non ci sarei mai arrivato da solo....

    Grazie ancora e buona giornata.

    Beppe

    giovedì 30 novembre 2017 06:58