Principale utente con più risposte
Query Raggruppamento e somma giorni

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!
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
-
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
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
-
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
-