Query SQL server 2005

venerdì 24 febbraio 2012 - 13.02

angeloswan Profilo | Newbie

Qualcuno mi può aiutare?
Ho 3 tabelle: PERSONE , ORE_LAVORATE, ORE_NON_LAVORATE che hanno in comune la PERSONA
Vorrei ottenere una tabella con:
PERSONE.NOME, ORE_LAV.DATA, ORE_LAV.ORE,ORE_NON_LAV.DATA,ORE_NON_LAV.ORE
Mi sto incartando e non ci riesco: mi potete aiutare?

CorriCorrado Profilo | Junior Member

Ciao,
scusa se mi permetto, ma quale è il problema? Non riesci a costruire la query o non ti torna il risultato?
Nel secondo caso hai impostato le chiavi per i record? Ossia, hai un campo identificatore univoco per la persona?

Facci sapere
Corrado

angeloswan Profilo | Newbie

Intanto ti ringrazio per avermi risposto.
Ho fatto il join, ma avendo le tabelle delle date diverse (normalmente la data di lavoro non è la data del non lavoro), mi restituisce dei valori errati nella colonna ore_non_lav.
Mi sono incartato e non riesco ad uscirne
Grazie

CorriCorrado Profilo | Junior Member

Secondo me puoi rivedere il concetto del DB, ossia:
una volta che hai le ore lavorate, puoi ottenere semplicemente le ore non lavorate come differenza tra le ore a budget o il monte ore teorico.
Ti chiedo cmq di riportare qui la struttura tabelle e la query che hai fatto, altrimenti diventa difficile.
Corrado

angeloswan Profilo | Newbie

SELECT DISTINCT
R5BOOKEDHOURS.BOO_DATE, R5BOOKEDHOURS.BOO_PERSON, R5BOOKEDHOURS.BOO_HOURS, R5EXCEPTIONS.EXC_DATE,
R5EXCEPTIONS.EXC_HOURS, R5EXCEPTIONS.EXC_COMMENT
FROM R5BOOKEDHOURS INNER JOIN
R5EXCEPTIONS ON R5BOOKEDHOURS.BOO_PERSON = R5EXCEPTIONS.EXC_PERSON
WHERE (R5BOOKEDHOURS.BOO_DATE = '2012-02-21') AND (R5EXCEPTIONS.EXC_DATE = '2012-02-21')
data Persona ORE_LAV GIORNO ORE_NON_LAV MOTIVO
2012-02-21 00:00:00.000 MALAGUTTI 0,500000 2012-02-21 00:00:00.000 1,000000 ASSEMBLEA
2012-02-21 00:00:00.000 MALAGUTTI 1,500000 2012-02-21 00:00:00.000 1,000000 ASSEMBLEA
2012-02-21 00:00:00.000 MALAGUTTI 2,000000 2012-02-21 00:00:00.000 1,000000 ASSEMBLEA
2012-02-21 00:00:00.000 MINGHINI 1,000000 2012-02-21 00:00:00.000 1,450000 permesso sindacale
2012-02-21 00:00:00.000 MINGHINI 1,500000 2012-02-21 00:00:00.000 1,450000 permesso sindacale
2012-02-21 00:00:00.000 RAPPA 0,500000 2012-02-21 00:00:00.000 1,000000 ASSEMBLEA
2012-02-21 00:00:00.000 RAPPA 1,000000 2012-02-21 00:00:00.000 1,000000 ASSEMBLEA
Come puoi vedere mi ripete i records delle ore_non_lav mentre le ore_lav vanno bene
Grazie

CorriCorrado Profilo | Junior Member

Spero di aver capito il problema.
Da quello che leggo vedo un paio di problemi nel tipo di query che stai costruendo e nelle informazione linkate.

Partiamo dalle chiavi; hai unito le tabelle con il campo PERSON che credo sia il cognome; se così fosse e hai due diverse persone con il cognome MALAGUTTI la tua query sommerà i due MALAGUTTI come se fossero una persona sola.

Secondo, hai fatto un select distinct per sapere cosa fa MALAGUTTI il 21 Febbraio unito alle ore non lavorate. Se MALAGUTTI nella tabella BOOKED HOURS ha 3 record: 0.5/1.5/2 la SELECT DISTINCT ti fa vedere 3 record; se la unisci alle ore non lavorate, dove c'è solo 1 record, otterrai la replica dei record.

La query che devi fare secondo me è una query di calcolo; quindi seleziona RAGGRUPPAMENTO e metti nel campo R5BOOKEDHOURS.BOO_HOURS (sum); a quel punto avrai il totale delle ore lavorate.

Se invece necessiti di avere la lista del dettaglio, non dovrai fare una query SELECT DISTINCT con il JOIN delle due tabelle, ma una query UNION. Quindi costruisci la prima query che ti da le ore lavorate e unisci il risultato alle ore non lavorate.

Corrado

angeloswan Profilo | Newbie

ho provato, ma il sum non fa altro che sommare i numeri riportati, i quali sono ripetuti.
Mi puoi spiegare meglio la UNION che ho provato ieri, ma lui a parità di campi "unisce" i rispettivi valori.
La qualcosa potrebbe funzionare se prima unisco le date e poi uso nella chiave la combinazione Persona e data (?)
Ciao

CorriCorrado Profilo | Junior Member

Unione:

SELECT (DISTINCT solo se necessario)
R5BOOKEDHOURS.BOO_DATE AS 'DATA',
R5BOOKEDHOURS.BOO_PERSON AS 'PERSONA',
R5BOOKEDHOURS.BOO_HOURS 'ORE LAVORATE,
'' AS 'ORE NON LAVORATE',
'' AS COMMENT

FROM
R5BOOKEDHOURS
WHERE (R5BOOKEDHOURS.BOO_DATE = '2012-02-21')

UNION

SELECT DISTINCT
R5EXCEPTIONS.EXC_DATE AS 'DATA',
R5EXCEPTIONS.EXC_PERSON AS 'PERSONA',
'' AS 'ORE LAVORATE',
R5EXCEPTIONS.EXC_HOURSAS 'ORE NON LAVORATE',
R5EXCEPTIONS.EXC_COMMENT
AS COMMENT

FROM
R5EXCEPTIONS
WHERE R5EXCEPTIONS.EXC_DATE = '2012-02-21'

Le colonne devo essere identiche, altrimenti non gira; praticamente unisce i risultati della prima query con quelli della seconda; avrai colonna ORE LAVORATE vuote se non ha lavorato, e viceversa. Nel caso volessi avere tutto su una colonna devi usare una colonna con alias ORE per entrambi.

Se hai dubbi chiedi

Corrado

angeloswan Profilo | Newbie

Grazie infinite! ci lavoro e ti dico

angeloswan Profilo | Newbie

ce l'ho fatta! Ti devo ringraziare ... Se passi da bologna il caffè è garantito.
Grazie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5