Query max

lunedì 15 dicembre 2008 - 08.48

ilario Profilo | Senior Member

ciao

devo recuperare in una tabella ( sql2008) il max valore di un numero con un where

select max(numero) from fatture where year(data) = ......

ma non funziona dove sbaglio

grazie
ilario

alx_81 Profilo | Guru

>ciao
Ciao!

>devo recuperare in una tabella ( sql2008) il max valore di un
>numero con un where
>select max(numero) from fatture where year(data) = ......
>ma non funziona dove sbaglio
"Non funziona" è un pochino generico. Dovresti postare la struttura della tabella, e dirci l'errore che ottieni.

>grazie
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

ilario Profilo | Senior Member

si scusa hai ragione

il messaggio di errore è che il campo data non fa parte di una funzione di aggregazione o di group by

se aggioungo group by data , non mi ritorna nessun record

la tabella è questa
USE [m&i]
GO

/****** Object: Table [dbo].[Fatture] Script Date: 12/15/2008 13:38:21 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Fatture](
[idFatture] [int] IDENTITY(1,1) NOT NULL,
[numero] [int] NOT NULL,
[data] [nvarchar](50) NULL,
[idcliente] [int] NULL,
[annotazioni] [nvarchar](max) NULL,
[altradestinazione] [nvarchar](max) NULL,
[spesetrasporto] [nvarchar](50) NULL,
[altrespese] [nvarchar](50) NULL,
[idtrasportatore] [int] NULL,
[acconto] [nvarchar](50) NULL,
[idivatrasporto] [int] NULL,
[idivaaltrespese] [int] NULL,
[sconto1] [nvarchar](50) NULL,
[sconto2] [nvarchar](50) NULL,
[idpagamenti] [int] NULL,
CONSTRAINT [PK_Fatture] PRIMARY KEY CLUSTERED
(
[idFatture] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


ti chiedo un altro consiglio

io ho inserito come campo cliente idcliente così la tabella fattura e legata al cliente, ma se per caso cambio i dati del cliente e richiamo una vecchia fattura i dati che mi compariranno saranno quelli nuovi, come mi devo comportare?

ciao
ilario

alx_81 Profilo | Guru

>il messaggio di errore è che il campo data non fa parte di una
>funzione di aggregazione o di group by
>se aggioungo group by data , non mi ritorna nessun record
Io ho provato ad inserire qualche record di prova e ho provato la tua query. Mi funziona, non capisco il problema.
SELECT MAX(numero) FROM fatture WHERE year(data) = 2008

sicuro che la query che lanci non abbia altri campi non aggregati nella select?

>io ho inserito come campo cliente idcliente così la tabella fattura
>e legata al cliente, ma se per caso cambio i dati del cliente
>e richiamo una vecchia fattura i dati che mi compariranno saranno
>quelli nuovi, come mi devo comportare?
Questo è un classico problema. Se tieni la relazione semplicemente, ad ogni cambiamento del cliente tutte le fatture legate saranno coinvolte nel cambiamento e quindi perdi la storia di quanto accaduto. Di solito si tende a fare una tabella che contenga la situazione effettivamente salvata, anche denormalizzata, che però renda persistente i dati salvati al momento nel tempo. Ad esempio, se hai una Fatture_Testata ed una Fatture_Dettaglio, puoi pensare ad una Fatture_Storico in cui non salverai gli id del cliente, ma il nome o la ragione sociale. In questo modo, salvandoti anche le date ovviamente, avrai la storia delle fatture senza perdere tracciabilità.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

ilario Profilo | Senior Member

<sicuro che la query che lanci non abbia altri campi non aggregati nella select?

si la query era select max(numero) from fatture where year(data) = .......

uso una funzione per ricavare in questo caso il numero

Public Function CaricaValore(ByVal sql As String, ByVal NomeCampo As String) As String
Try

Dim DcValore As New SqlClient.SqlCommand(sql, DB)

Dim DrValore As SqlClient.SqlDataReader = DcValore.ExecuteReader

DrValore.Read()

If DrValore.IsDBNull(0) = False Then
Return (CStr(DrValore(NomeCampo)))
Else
Return ""
End If

DrValore.Close()
DcValore.Dispose()

Catch ex As Exception
ShowMessage(ex.Message, "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return ""

End Try
End Function

dopo vari tentativi mi funziona passandogli questa

maxvalore = DbDati.CaricaValore("select max(numero) as Valore from fatture where year(data) = " & String.Format("{0:yyyy}", CDate(txtdataFatture.Text)), "Valore")

a parte un errore nella sub che avevo fatto anzichè fare If DrValore.IsDBNull(0) usavo if DrValore.HasRows e mi restituiva sempre true , mi dava sempre l'errore che data non faceva parte di group by

comunque adesso funziona bene

grazie


per il discorso invece tabella fattura cliente, a questo punto non è meglio mettere tutti i dati del cliente nella fattura testata , perchè se devo per caso ristampare una vecchia fattura non basta una tabella storico contenente solo la ragione sociale e la data

ciao e grazie ancora

ilario

alx_81 Profilo | Guru

>maxvalore = DbDati.CaricaValore("select max(numero) as Valore
>from fatture where year(data) = " & String.Format("{0:yyyy}",
>CDate(txtdataFatture.Text)), "Valore")
Attenzione a concatenare le stringhe in quel modo, utilizza le query parametriche per non incorrere in attacchi di tipo SQL Injection.
Ti invito a leggere questo articolo:

http://www.dotnethell.it/articles/SQL-Injection-Tutorial-Security.aspx

>per il discorso invece tabella fattura cliente, a questo punto
>non è meglio mettere tutti i dati del cliente nella fattura testata
>, perchè se devo per caso ristampare una vecchia fattura non
>basta una tabella storico contenente solo la ragione sociale e la data
Beh devi mettere nella storico tutte le info che ti serviranno. Ma non appesantire inutilmente quelle che possono essere considerate "Online".. Cerca di disaccoppiare, anche logicamente è meglio ed eviti di denormalizzare il tuo db lasciandolo snello e più manutenibile.

>ciao e grazie ancora
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

ilario Profilo | Senior Member

<Attenzione a concatenare le stringhe in quel modo, utilizza le query parametriche per non incorrere in <attacchi di tipo SQL Injection

grazie per il consiglio proverò a studiarmi le query parametriche

ma l'attacco può avvenire solo sulle select o anche uptade insert e .....?

alx_81 Profilo | Guru

><Attenzione a concatenare le stringhe in quel modo, utilizza
>le query parametriche per non incorrere in <attacchi di tipo
>SQL Injection
>
>grazie per il consiglio proverò a studiarmi le query parametriche
>
>ma l'attacco può avvenire solo sulle select o anche uptade insert
>e .....?
Ovunque concateni stringhe SQL
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
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