Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Belo Horizonte, Brazil
    Messaggi
    258

    Problema query

    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.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Originariamente inviato da x_raystyle
    Non so se è la sezione giusta dove parlare di queries.
    La sezione è giusta, ma c'è anche un Regolamento 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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    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:
    codice:
    mese (char)
    mese_anno(mm/aaaa)
    codice:
    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)
    codice:
    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Belo Horizonte, Brazil
    Messaggi
    258
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.