2011-03-30 7 views
2

Je cherche à sélectionner des lignes d'une table avec une requête comme celleSELECT MAX date T-SQL sous-requête

SELECT  pminf_member, pminf_schmem 
     , pminf_date, pminf_fund 
     , pminf_cont, pminf_rate 
     , pminf_matrix 
FROM pe_minvf 
WHERE (pminf_member = 4380) 
    AND (pminf_schmem = 'M') 
    AND (pminf_date <= '03/30/2011') 
    AND (pminf_date = 
      (SELECT MAX(pminf_date) AS Expr1 
      FROM pe_minvf AS pe_minvf_1 
      WHERE (pminf_member = 4380) 
      ) 
     ) 
    AND (pminf_fund = 'LIFESTYLE') 

Ce que je devrais obtenir de mon sous-requête (je pense) est une date de '01/01/2011 'mais quand je cours ma requête je ne reçois aucun résultat.

Si je remplace la sous-requête par la date codée en dur, les lignes correctes sont renvoyées. Par exemple

SELECT pminf_member, pminf_schmem 
     , pminf_date, pminf_fund 
     , pminf_cont, pminf_rate 
     , pminf_matrix 
FROM pe_minvf 
WHERE (pminf_member = 4380) 
    AND (pminf_schmem = 'M') 
    AND (pminf_date <= '03/30/2011') 
    AND (pminf_date = '01/01/2011') 
    AND (pminf_fund = 'LIFESTYLE') 

Cette requête renvoie les résultats corrects.

Des idées pour lesquelles la sous-requête ne renvoie pas la date max ou si oui, pourquoi ne récupère-je pas de ligne?

Merci, Tristan

+1

Qu'est-ce que vous obtenez ce que vous exécutez la sous-requête seul? – Fillet

+0

Je ne comprends pas ces conditions: ... ET (pminf_date <= '03/30/2011 ') AND (pminf_date = '01/01/2011') - ne pense jamais - mais je ne peux pas supprimer ce commentaire. SO ne me laissera pas. – Tim

+0

Je reçois la date correcte renvoyée si j'exécute la sous-requête par elle-même. – TGuimond

Répondre

6

Vous filtrez sur les différentes conditions dans vos requêtes.

pminf_fund = 'LIFESTYLE' dans la sous-requête, mais pminf_schmem = 'M' dans la requête externe.

De plus, vous limitez la date dans la requête externe et ne le faites pas dans la sous-requête.

Si vous avez juste besoin d'enregistrement le plus récent jusqu'à '03/30/2011' , utilisez ceci:

SELECT TOP 1 
     pminf_member, pminf_schmem, pminf_date, pminf_fund, pminf_cont, pminf_rate, pminf_matrix 
FROM pe_minvf 
WHERE pminf_member = 4380 
     AND pminf_schmem = 'M' 
     AND pminf_fund = 'LIFESTYLE' 
     AND pminf_date <= '03/30/2011' 
ORDER BY 
     pminf_date DESC 
+0

Malheureusement, je n'ai pas besoin de l'enregistrement le plus récent. J'ai besoin de date de la contribution la plus récente, peu importe si elle est de type «LIFESTYLE» ou non. J'ai besoin de voir si le fonds actuel est en effet 'LIFESTYLE' ou pas .. – TGuimond

+0

Oui, il peut y avoir plusieurs types pour ce champ mais je ne veux que les résultats retournés si le pminf_field = 'M' mais je ne le veux pas soit le cas lors de la sélection de la date la plus récente. – TGuimond

+0

@TGuimond: si l'enregistrement le plus récent n'est pas "LIFESTYLE", voulez-vous qu'il soit retourné ou non? Aussi, voulez-vous qu'il soit retourné s'il est postérieur à ''03/30/2001''? – Quassnoi

0

La requête:

SELECT MAX(pminf_date) AS Expr 
FROM pe_minvf AS pe_minvf_1 
WHERE (pminf_member = 4380) 
; 

retours '01/01/2011' ou autre chose?

Peut-être que vous voulez les mêmes conditions sur la sous-requête comme dans e requête Emain:

SELECT MAX(pminf_date) AS Expr 
FROM pe_minvf AS pe_minvf_1 
WHERE (pminf_member = 4380) 
    AND (pminf_schmem = 'M') 
1
SELECT  pminf_member, pminf_schmem 
     , pminf_date, pminf_fund 
     , pminf_cont, pminf_rate 
     , pminf_matrix 
FROM pe_minvf 
WHERE (pminf_member = 4380) 
    AND (pminf_schmem = 'M') 
    AND (pminf_date = 
      (SELECT MAX(pminf_date) AS Expr1 
      FROM pe_minvf AS p 
      WHERE (p.pminf_member = 4380) AND 
        p.pminf_date <= '03/30/2011' 
      ) 
     ) 
    AND (pminf_fund = 'LIFESTYLE') 
0

utiliser une sous-requête pour limiter les lignes au lieu de retour la clause where. Utilisez ceci comme la sous-requête:

(SELECT MAX(pminf_date) AS Expr1    
FROM pe_minvf AS pe_minvf_1    
WHERE (pminf_member = 4380) 

Gardez la requête fondamentalement la même ...

Select same_fields_as you_did_before 
from pe_minvf 
inner join 
(SELECT MAX(pminf_date) AS Maxdate, tablekey    
FROM pe_minvf AS pe_minvf_1    
WHERE pminf_member = 4380) a on a.tablekey = pe_minvf.table_key 
where same_where_clause_you_had 

sens? Je n'étais pas sûr de ce que votre table_key était sur pe_minvf ... vous devrez l'insérer vous-même. Je trouve qu'utiliser des sous-faces et des adn internes pour les joindre est un moyen plus efficace de limiter les lignes et d'avoir une sous-requête dans votre clause where

0

Douzième! Merci pour la syntaxe correcte ... Je l'ai utilisé pour résoudre mon problème similaire de-jur (du jour) Sauf si je me trompe, ce que j'ai ci-dessous va travailler .. Si ce n'est pas le cas, je vais le réparer ici ... Dans l'exemple ci-dessous, le nom des champs de données a été nettoyé mais la syntaxe a fonctionné très rapidement. Soit dit en passant, il y a 20480 device_id distincts

declare 
@BegDate varchar(20)=(select cast(CONVERT(VARCHAR(20), getdate()-2,101) as varchar(20)) + ' 10:59:59 PM') 
,@EndDate varchar(20)=(select cast(CONVERT(VARCHAR(20), getdate()-0,101) as varchar(20)) + ' 11:00:00 PM') 
    select f1.ABC_ConfigProcStatusID,f1.DeviceID,f1.DBfilename ,f1.LastUpdatedDate 
    from dbo.ABC_ConfigProcStatus f1 
     inner join 
      (select distinct DeviceID,max(LastUpdatedDate) as max_DeviceIDdte 
      from dbo.ABC_ConfigProcStatus 
      where [Status]=2 
      and DeviceID not in(select ExclusionDeviceIDs from ABC_ConfigDeviceIDExclusionList) 
      group by DeviceID) f2 
     on f2.max_DeviceIDdte = f1.LastUpdatedDate 
    where [Status]=2 
    and f2.DeviceID = f1.DeviceID 
    and f1.DeviceID not in(select ExclusionDeviceIDs from ABC_ConfigDeviceIDExclusionList) 
    and LastUpdatedDate between @BegDate and @EndDate 
    and left(upper(f1.DeviceID),3) in ('XYZ','ZKO') 
    order by f1.LastUpdatedDate 
+0

Désolé, je n'ai pas pu obtenir le message pour conserver le bon format. HF. –