PDA

Visualizza la versione completa : [SQL SERVER] SELECT della somma dei valori


x_raystyle
09-09-2009, 12:20
Non so se è la sezione giusta dove parlare di queries. Se ho sbagliato sezione scusatemi.
Ho un problema nel fare una query. Innanzitutto vi dico com'è formata la tabella in questione.

id_timesheet (mm/aaaa)
id_dipendente
data_timesheet (gg/mm/aaaa)
cod_arca (codice cliente)
cod_commessa
ore (ore lavorate in quel giorno dal dipendente)

Bene. Il mio obbiettivo è creare una select che estragga, da quella tabella, sulla prima colonna, tutti i dipendenti esistenti. Dopodiché la somma delle ore di un singolo dipendente per ogni mese. Per esempio il dipendente pippo ha lavorato nel mese di gennaio 160 ore, nel mese di febbraio 140.. e così via.
Giusto per avere un'idea più chiara di dove voglio arrivare e mostrarvi il mio problema ecco la query che sono riuscito a fare:


SELECT ID_Dipendente,
Gennaio = CASE WHEN (SELECT SUM(Ore)
FROM Timesheet
WHERE ID_Timesheet = '01/2009')<25
OR (SELECT SUM(Ore)
FROM Timesheet
WHERE ID_Timesheet = '01/2009') IS NULL
THEN 'INCOMPLETO'
ELSE 'COMPLETO'
END,
Febbraio = CASE WHEN (SELECT SUM(Ore)
FROM Timesheet
WHERE ID_Timesheet = '02/2009')<25
OR (SELECT SUM(Ore)
FROM Timesheet
WHERE ID_Timesheet = '02/2009') IS NULL
THEN 'INCOMPLETO'
ELSE 'COMPLETO'
END,
Marzo = CASE WHEN (SELECT SUM(Ore)
FROM Timesheet
WHERE ID_Timesheet = '03/2009')<25
OR (SELECT SUM(Ore)
FROM Timesheet
WHERE ID_Timesheet = '03/2009') IS NULL
THEN 'INCOMPLETO'
ELSE 'COMPLETO'
END
FROM Timesheet
GROUP BY ID_Dipendente

Mi restituisce una select simile a quella che voglio ma non del tutto giusta, perché così facendo per ogni cella delle ore mi restituisce la somma di tutte le ore presenti nella tabella, quindi senza "discriminazioni", anche se con dipendenti diversi. Invece vorrei leggere da questa select la somma delle ore di un dipendente in un certo mese.
Potete aiutarmi? Io uso SQL Server '05 Express.

alka
09-09-2009, 13:33
Originariamente inviato da x_raystyle
Non so se è la sezione giusta dove parlare di queries.
La sezione è giusta, ma c'è anche un Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887) da leggere per poterlo verificare e per conoscere tutti i requisiti che una discussione deve avere, ad esempio un titolo adeguato.

Questo l'ho corretto io: per il futuro, provvedi tu.

Dalton
09-09-2009, 20:53
Io su Oracle avrei fatto cosi, ovvero avrei creato una tabella popolata dai mesi dell'anno e poi unito il tutto con un left join:


mese (char)
mese_anno(mm/aaaa)



id_timesheet (mm/aaaa)
id_dipendente
data_timesheet (gg/mm/aaaa)
cod_arca (codice cliente)
cod_commessa
ore (ore lavorate in quel giorno dal dipendente)



Select id_dipendente, sum(ore) as somma,mese
from tab_sheet left join table_mese on mese_anno=id_timesheet
group by id_dipendente, mese

ciao

x_raystyle
10-09-2009, 16:33
Sono riuscito a risolverlo ma utilizzando un altro metodo.
Eccolo:


WITH cte AS
(
SELECT ID_Dipendente, ID_Timesheet, SUM(Ore) AS Ore
FROM Timesheet
GROUP BY ID_Dipendente, ID_Timesheet
)

SELECT ID_Dipendente,
CASE WHEN ISNULL([01/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Gennaio],
CASE WHEN ISNULL([02/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Febbraio],
CASE WHEN ISNULL([03/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Marzo],
CASE WHEN ISNULL([04/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Aprile],
CASE WHEN ISNULL([05/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Maggio],
CASE WHEN ISNULL([06/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Giugno],
CASE WHEN ISNULL([07/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Luglio],
CASE WHEN ISNULL([08/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Agosto],
CASE WHEN ISNULL([09/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Settembre],
CASE WHEN ISNULL([10/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Ottobre],
CASE WHEN ISNULL([11/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Novembre],
CASE WHEN ISNULL([12/2009], 0) < 160 THEN '-' ELSE 'Completo' END AS [Dicembre]
FROM cte
PIVOT (SUM(Ore) FOR ID_Timesheet IN ( [01/2009], [02/2009], [03/2009], [04/2009], [05/2009], [06/2009],
[07/2009], [08/2009], [09/2009], [10/2009], [11/2009], [12/2009])) AS pvt

Grazie comunque del consiglio.

Loading