Estrapolare max record

domenica 07 giugno 2015 - 10.12
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010  |  MySQL 5.5

Mau67 Profilo | Expert

Buona domenica al forum,
volevo chiedere se qualcuno più esperto di me mi aiuta a risolvere questo problema.
Praticamente da una tabella devo sommare tutti gli importi riferiti ad un amministrato e visualizzare solo l'ultimo mese e anno di pagamento.
Nella tabella il mese è scritto in formato testo.

posto la select che uso:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

grazie in anticipo
Mau67

ysdemarc Profilo | Expert

Ciao, non capisco affatto cosa vuoi fare con la join visto che ti serve solo a mettere in relazione tabelle per selezionare i campi di una sola tabella e la selezione where che fai nella tabella stipendio la puoi benissimo fare nella tablella stipendio_dettagli.

un modo per poter fare quello che dici potrebbe essere questo (scrivo in SQL):

SELECT TOP 1 stipendio_dettaglio.Mese AS Ultimo_Mese , stipendio_dettaglio.Anno AS Ultimo_Anno , T.Tot_Tfr FROM stipendio_dettaglio INNER JOIN ( SELECT SUM ( TFR ) AS Tot_Tfr , ID_Anagrafica FROM stipendio_dettaglio GROUP BY ID_Anagrafica ) T ON T.ID_Anagrafica = = stipendio_dettaglio.ID_Anagrafica WHERE stipendio_dettaglio.ID_Anagrafica = @m_ParametroID_Anagrafica ORDER BY stipendio_dettaglio.Anno DESC , stipendio_dettaglio.Mese DESC

In pratica metto in relazione la tabella stipendio_dettaglio cion una sub query della stessa tabella che mi da il totale del tfr di tutte le righe per id-anagrafica
poi dico alla SELECT di darmi solo la prima riga che conterrà l'ultimo periodo poichè la ORDER BY mi restituisce le righe con ordine decrescente per Anno e Mese


Vincenzo
Programmatore sbilenco

Mau67 Profilo | Expert

Ciao grazie per la risposta,
ho provato ma la select che hai scritto non mi restituisce nessun dato
Grazie
Mau67

ysdemarc Profilo | Expert

Non vedo errori nella select controlla singolarmente il risultato della sub query

SELECT SUM ( TFR ) AS Tot_Tfr , ID_Anagrafica FROM stipendio_dettaglio GROUP BY ID_Anagrafica

e il valore che passi al posto del paramentro @m_ParametroID_Anagrafica
e che questo valore sia in stipendio_dettalio

la select è molto semplice, secondo me è il valore in @m_ParametroID_Anagrafica che non è presente in tabella
Vincenzo
Programmatore sbilenco

Mau67 Profilo | Expert

togliendo top 1 funziona ma restituisce sempre e solo marzo come mese e togliendo DESC da mese e anno restituisce APRILE e non maggio che è l'ultimo mese inserito

Questo è il codice:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Mau67

ysdemarc Profilo | Expert

TOP 1 gli dice di prendere la prima riga secondo l'ordine specificato. Io lo uso in SQL Server ma anche in access mi sembri funzioni ma non ne sono sicuro..
a seconda il db che usi cerca nella documentazione che comandi sql supporta.

Se ti restituisce solo marzo forse avrei solo marzo nei tuoi dati?

se fai

SELECT *
FROM stipendio_dettaglio
WHERE ID_Anagrafia = @parmatro_id_anagrafica

cosa ti restituisce? (naturalmente @parmatro_id_anagrafica è sempre il valore che hai passato prima )

ps: "Group By stipendio_dettaglio.Mese,stipendio_dettaglio.Anno, T.Tot_Tfr" toglila, in questo contesto non serve a niente e l'ordinamento non è corretto, deve essere decrescente (DESC)

ps: sistemata la group e soprattuto la order se non puoi usare TOP 1 potresti passare all'ExecuteReader l'argomento CommandBehavior.SingleRow che ti restituirà solo la prima riga

Mau67 Profilo | Expert

Ok però devo precisare che i mesi inseriti nel campo mese sono in formato testo "GENNAIO"; "FEBBRAIO";"MARZO" ecc. il database è MySQL

Mau67

ysdemarc Profilo | Expert

questo è un bel problema non voglio neanche chiederti perchè..

prova a sostuirla con questa:


SELECT S.Ultimo_Mese , S.Ultimo_Anno , T.Tot_Tfr FROM (SELECT stipendio_dettaglio.Mese AS Ultimo_Mese , stipendio_dettaglio.Anno AS Ultimo_Anno , (CASE stipendio_dettaglio.Mese WHEN 'GENNAIO' THEN 1 WHEN 'FEBBRAIO' THEN 2 WHEN 'MARZO' THEN 3 WHEN 'APRILE' THEN 4 WHEN 'MAGGIO' THEN 5 WHEN 'GIUGNO' THEN 6 WHEN 'LUGLIO' THEN 7 WHEN 'AGOSTO' THEN 8 WHEN 'SETTEMBRE' THEN 9 WHEN 'OTTOBRE' THEN 10 WHEN 'NOVEMBRE' THEN 11 WHEN 'DICEMBRE' THEN 12 END) as MeseNumerico , ID_Anagrafica FROM stipendio_dettaglio) S INNER JOIN ( SELECT SUM ( TFR ) AS Tot_Tfr , ID_Anagrafica FROM stipendio_dettaglio GROUP BY ID_Anagrafica ) T ON T.ID_Anagrafica = = S.ID_Anagrafica WHERE S.ID_Anagrafica = @m_ParametroID_Anagrafica ORDER BY S.Anno DESC , S.MeseNumerico DESC

Poi se non sbaglio in mySql l'equivalente del
TOP 1
è a fine query inserire il comando
LIMIT 1

PS: naturalmente se il campo mese potrebbe essere sia maiusco che minuscolo o con spazi sarebbe opportuno che nella CASE tolga gli spazi e la renda tutta maiuscola

Mau67 Profilo | Expert

Ok perfetto grazie
Ciao alla prossima
Mau67
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5