Sous-requête – Renvoie la valeur NULL, si elle ne correspond pas à la plus haute

Je veux sélectionner le numéro du solde le plus élevé d'une table pour mon projet de test.

Par exemple, si l'user dit, il veut savoir le 5ème plus haut solde, ma requête devrait returnner le nom correspondant.

Voici un exemple de table de test pour le scénario:

CREATE TABLE ACCT_MSTR( ACCTID INTEGER PRIMARY KEY, NAME VARCHAR(50), CITY VARCHAR(20), BRID VARCHAR(5), DOO DATETIME, CBALANCE MONEY, UBALANCE MONEY, STATUS VARCHAR(1) ) INSERT INTO ACCT_MSTR VALUES(101, 'SARA', 'BLR', 'BR1', GETDATE(), 1000, 1000, 'A') INSERT INTO ACCT_MSTR VALUES(102, 'SANTHOSH', 'BLR', 'BR10', GETDATE() - 40, 5500, 100, 'A') INSERT INTO ACCT_MSTR VALUES(103, 'KAVIN', 'GOBI', 'GI20', GETDATE() - 100, 2500, 10500, 'U') INSERT INTO ACCT_MSTR VALUES(104, 'ARAVIND', 'GOBI', 'GI20', GETDATE() - 20, 10000, 5500, 'A') INSERT INTO ACCT_MSTR VALUES(105, 'BALA', 'HYD', 'HYD2', GETDATE()-1000, 1000, 500, 'U') INSERT INTO ACCT_MSTR VALUES(106, 'PRABU', 'TUP', 'TUP25', GETDATE() - 1000, 7500, 1000, 'A') INSERT INTO ACCT_MSTR VALUES(107, 'ANBU', 'CHE', 'CHE1', GETDATE()-250, 8000, 1000, 'A') INSERT INTO ACCT_MSTR VALUES(108, 'AMAR', 'CHE', 'CHE3', GETDATE()-2500, 7800, 1000, 'U') INSERT INTO ACCT_MSTR VALUES(109, 'DHINESH', 'CBE', 'CBE1', GETDATE()-150, 3500, 1000, 'A') INSERT INTO ACCT_MSTR VALUES(110, 'DUPARAVIND', 'GOBI', 'GI20', GETDATE() - 20, 10000, 5500, 'A') INSERT INTO ACCT_MSTR VALUES(111, 'DUPSANTHOSH', 'BLR', 'BR10', GETDATE() - 40, 5500, 100, 'A') 

J'ai utilisé la requête suivante (pour le 5ème plus haut):

 SELECT NAME FROM ACCT_MSTR WHERE CBALANCE = ( SELECT MIN(CBALANCE) FROM ACCT_MSTR WHERE CBALANCE IN ( SELECT DISTINCT TOP 5 CBALANCE FROM ACCT_MSTR ORDER BY CBALANCE DESC ) ) 

Si je veux savoir le 15 plus haut qui est invalide (Nombre total d'loggings dans la table elle-même 12 seulement), il devrait returnner NULL. Au lieu de cela, il returnne la dernière valeur la plus élevée de la table, puisque j'ai utilisé TOP 15 .

Toute idée de returnner NULL, si elle ne correspond pas à la condition donnée dans ce cas.

En supposant que vous utilisez SQL Server, vous pouvez:

 declare @name varchar(50) select @name = name from ( select row_number() over (order by CBALANCE desc) rn , name from acct_mstr ) as SubQueryAlias where rn = 15 -- Return a rowset of one row, even if no row matched -- the where clause above select @name as name