none
Query Raggruppamento e somma giorni RRS feed

  • Domanda

  • Ciao e buon giorno. Ho una tabella di questo tipo sotto database SQL2008Express.

    ID | NOME | PARTENZA | RIENTRO

    1 LUCA 10/04/2009 26/06/2009
    2 SIMONE 10/05/2009 23/05/2009
    3 LUCA 27/06/2009 24/08/2010
    4 SIMONE 01/01/2010 19/03/2010
    5 MARTINA 01/02/2009 23/05/2009

     

    Praticamente quello che devo fare (e che non riesco è)

    -Raggruppare per nome (e so farlo)

    -Fare la somma dei giorni di ciascuna uscita calcolandola mediante data rientro - data uscita.

    Tipo: Luca - 120 

            Simone - 200

            Martina - 30

    e cosi via...

    E' fattibile?

    Ah dimenticavo, se la trasferta è di 1 giorni Es: MARCO | 04/04/2010 | 04/04/2010 (tipo dalla mattina alla sera) deve considerare 1 e non 0!

    lunedì 21 giugno 2010 08:50

Risposte

  • Non so se ho capito correttamente il tuo problema. Prova a vedere se è corretto.

    set

     

    nocount on;

    -- Creo la tabella temporanea

    create

     

    table #myTable
    (
    ID int,
    NOME varchar(25),
    PARTENZA smalldatetime,
    RIENTRO smalldatetime
    )

    -- Inserisco i dati d'esempio

     

    insert into #myTable values(1, 'LUCA', '20090410', '20090626')
    insert into #myTable values(2, 'SIMONE', '20090510', '20090523')
    insert into #myTable values(3, 'LUCA', '20090627', '20090824')
    insert into #myTable values(4, 'SIMONE', '20100101', '20100319')
    insert into #myTable values(5, 'MARTINA', '20090201', '20090523');

    -- Utilizzo una CTE (Common Table Expressions)

     

    with myDate(Nome, theDays)
    as
    (
    select
      Nome
    ,
     
    datediff(day, partenza, rientro) + 1 as test
    from #mytable
    group by nome, datediff(day, partenza, rientro)
    )

    select

     


      A
    .NOME,
     
    SUM(A.theDays) as 'Giorni'
    from myDate AS A
    group by A.nome

    /*
    Outpup
    NOME Giorni
    ------------------------- -----------
    LUCA 502
    MARTINA 112
    SIMONE 92
    */

    -- Elimino la tabella temporanea

     

    drop table #myTable


    -- Sandro Bizioli http://blogs.dotnethell.it/sandro/
    • Contrassegnato come risposta Casey Stoner lunedì 21 giugno 2010 12:08
    lunedì 21 giugno 2010 09:38
  • Ciao,

    puoi usare la funzione datediff per calcolare il numero di giorni per poi sommarli.
    Per maggiori info vedi: DATEDIFF (Transact-SQL)

    Qui un piccolo esempio:

    USE tempdb
    GO
    -- Creo la tabella
    CREATE TABLE dbo.Tabella
    (ID Int,
     NOME Varchar(30),
     PARTENZA Datetime,
     RIENTRO Datetime
     );
     
    -- Inserisco i dati
    INSERT INTO dbo.Tabella
    VALUES (1,'LUCA','20090410','20090626'),
        (2,'SIMONE','20090510','20090523'),
        (3,'LUCA','20090627','20100824'),
        (4,'SIMONE','20100101','20100319'),
        (5,'MARTINA','20090201','20090523')
    
    -- Eseguo la select
    SELECT NOME,SUM(DATEDIFF(d,PARTENZA,RIENTRO)+1) AS GIORNI
    FROM  dbo.Tabella
    GROUP BY NOME
    
    --Pulizia
    DROP TABLE dbo.Tabella
    
    /*
    Risultato
    NOME              GIORNI
    ------------------------------ -----------
    LUCA              502
    MARTINA            112
    SIMONE             92
    */
    Ciao
    Giorgio Rancati
    • Contrassegnato come risposta Casey Stoner lunedì 21 giugno 2010 12:08
    lunedì 21 giugno 2010 10:02
    Moderatore

Tutte le risposte

  • Non so se ho capito correttamente il tuo problema. Prova a vedere se è corretto.

    set

     

    nocount on;

    -- Creo la tabella temporanea

    create

     

    table #myTable
    (
    ID int,
    NOME varchar(25),
    PARTENZA smalldatetime,
    RIENTRO smalldatetime
    )

    -- Inserisco i dati d'esempio

     

    insert into #myTable values(1, 'LUCA', '20090410', '20090626')
    insert into #myTable values(2, 'SIMONE', '20090510', '20090523')
    insert into #myTable values(3, 'LUCA', '20090627', '20090824')
    insert into #myTable values(4, 'SIMONE', '20100101', '20100319')
    insert into #myTable values(5, 'MARTINA', '20090201', '20090523');

    -- Utilizzo una CTE (Common Table Expressions)

     

    with myDate(Nome, theDays)
    as
    (
    select
      Nome
    ,
     
    datediff(day, partenza, rientro) + 1 as test
    from #mytable
    group by nome, datediff(day, partenza, rientro)
    )

    select

     


      A
    .NOME,
     
    SUM(A.theDays) as 'Giorni'
    from myDate AS A
    group by A.nome

    /*
    Outpup
    NOME Giorni
    ------------------------- -----------
    LUCA 502
    MARTINA 112
    SIMONE 92
    */

    -- Elimino la tabella temporanea

     

    drop table #myTable


    -- Sandro Bizioli http://blogs.dotnethell.it/sandro/
    • Contrassegnato come risposta Casey Stoner lunedì 21 giugno 2010 12:08
    lunedì 21 giugno 2010 09:38
  • Ciao,

    puoi usare la funzione datediff per calcolare il numero di giorni per poi sommarli.
    Per maggiori info vedi: DATEDIFF (Transact-SQL)

    Qui un piccolo esempio:

    USE tempdb
    GO
    -- Creo la tabella
    CREATE TABLE dbo.Tabella
    (ID Int,
     NOME Varchar(30),
     PARTENZA Datetime,
     RIENTRO Datetime
     );
     
    -- Inserisco i dati
    INSERT INTO dbo.Tabella
    VALUES (1,'LUCA','20090410','20090626'),
        (2,'SIMONE','20090510','20090523'),
        (3,'LUCA','20090627','20100824'),
        (4,'SIMONE','20100101','20100319'),
        (5,'MARTINA','20090201','20090523')
    
    -- Eseguo la select
    SELECT NOME,SUM(DATEDIFF(d,PARTENZA,RIENTRO)+1) AS GIORNI
    FROM  dbo.Tabella
    GROUP BY NOME
    
    --Pulizia
    DROP TABLE dbo.Tabella
    
    /*
    Risultato
    NOME              GIORNI
    ------------------------------ -----------
    LUCA              502
    MARTINA            112
    SIMONE             92
    */
    Ciao
    Giorgio Rancati
    • Contrassegnato come risposta Casey Stoner lunedì 21 giugno 2010 12:08
    lunedì 21 giugno 2010 10:02
    Moderatore
  • Grazie Ragazzi, ottime risposte.

    Buon lavoro!

    lunedì 21 giugno 2010 12:08