Select max nidificato

venerdì 03 dicembre 2010 - 09.55
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows 7  |  Visual Studio 2008  |  SQL Server Express

denis.basei Profilo | Senior Member

Data una tabella SQL strutturata come a seguire ....

CREATE TABLE [dbo].[BufferLinea1](
[Prg] [smallint] NOT NULL CONSTRAINT [DF_BufferLinea1_Prg] DEFAULT ((0)),
[PrgElementi] [tinyint] NOT NULL CONSTRAINT [DF_BufferLinea1_PrgElementi] DEFAULT ((1)),
[Lista] [char](4) COLLATE Latin1_General_CS_AS NULL,
[Consegna] [decimal](5, 0) NULL,
[NumeroColli] [decimal](5, 0) NULL,
[Profondita] [float] NOT NULL CONSTRAINT [DF_BufferLinea1_Profondita] DEFAULT ((0)),
CONSTRAINT [PK_BufferLinea1] PRIMARY KEY CLUSTERED
(
[Prg] ASC,
[PrgElementi] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
go



... all'interno della quale ci sono i seguenti dati...

insert into BufferLinea1 values (1, 1, '111', 1, 234, 400)
insert into BufferLinea1 values (2, 1, '111', 2, 345, 400)
insert into BufferLinea1 values (2, 2, '111', 2, 467, 400)
insert into BufferLinea1 values (2, 3, '111', 2, 321, 400)
insert into BufferLinea1 values (3, 1, '231', 5, 213, 400)
insert into BufferLinea1 values (3, 2, '231', 5, 543, 400)


... vorrei, se possibile, eseguire un'unica query che mi restituisca il record con il valore massimo di Prg e il valore massimo di PrgElementi. Per quest'ultimo la ricerca deve essere limitata ai records con Prg = Max(Prg).
In sostanza mi deve restituire l'ultimo record. Attualmente visto che Prg e PrgElementi sono in chiave leggo l'ultimo record ma ero comunque curioso di capire se si potrebbe fare con una query.


Grazie
Denis B. - www.baseiengineering.com

lbenaglia Profilo | Guru

>... vorrei, se possibile, eseguire un'unica query che mi restituisca
>il record con il valore massimo di Prg e il valore massimo di
>PrgElementi. Per quest'ultimo la ricerca deve essere limitata
>ai records con Prg = Max(Prg).
>In sostanza mi deve restituire l'ultimo record. Attualmente visto
>che Prg e PrgElementi sono in chiave leggo l'ultimo record ma
>ero comunque curioso di capire se si potrebbe fare con una query.

Ciao Denis,

Una soluzione semplice che mi viene in mente consiste nel restituire la riga che contiene i valori di Prg e PrgElementi massimi:

USE tempdb; CREATE TABLE dbo.BufferLinea1( Prg smallint NOT NULL CONSTRAINT DF_BufferLinea1_Prg DEFAULT (0), PrgElementi tinyint NOT NULL CONSTRAINT DF_BufferLinea1_PrgElementi DEFAULT (1), Lista char(4) COLLATE Latin1_General_CS_AS NULL, Consegna decimal(5, 0) NULL, NumeroColli decimal(5, 0) NULL, Profondita float NOT NULL CONSTRAINT DF_BufferLinea1_Profondita DEFAULT (0), CONSTRAINT PK_BufferLinea1 PRIMARY KEY(Prg, PrgElementi) ); INSERT dbo.BufferLinea1 VALUES (1, 1, '111', 1, 234, 400); INSERT dbo.BufferLinea1 VALUES (2, 1, '111', 2, 345, 400); INSERT dbo.BufferLinea1 VALUES (2, 2, '111', 2, 467, 400); INSERT dbo.BufferLinea1 VALUES (2, 3, '111', 2, 321, 400); INSERT dbo.BufferLinea1 VALUES (3, 1, '231', 5, 213, 400); INSERT dbo.BufferLinea1 VALUES (3, 2, '231', 5, 543, 400); SELECT TOP(1) * FROM dbo.BufferLinea1 ORDER BY Prg DESC, PrgElementi DESC; /* Output: Prg PrgElementi Lista Consegna NumeroColli Profondita ------ ----------- ----- --------- ------------ ----------- 3 2 231 5 543 400 (1 row(s) affected) */ DROP TABLE dbo.BufferLinea1;

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

denis.basei Profilo | Senior Member

Caspita in effetti non era poi così difficile! Grazie!!
Denis B. - www.baseiengineering.com
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5