2017-10-18 4 views
0

J'ai le tableau ci-dessous:MAX Avec l'expression CASE

Critères:

Prenez EndDate de la dernière ligne par ID Si EndDate est nul alors actif Si endDate est non nul alors fermé

TableA

StartDate  EndDate   ID 
    04/01/2017  06/30/2017  1 
    10/01/2017      1 
    11/01/2017  05/01/2017  2 

Résultats attendus:

StartDate  EndDate   ID CurrentStatus 
    04/01/2017  06/30/2017  1  Active 
    10/01/2017      1  Active 
    11/01/2017  11/02/2017  2  Closed 

code Sql:

SELECT * 
MAX(CASE WHEN CCP.ENDDATE IS NULL THEN 'Active' END) 
     OVER (PARTITION BY CCP.ID) AS CURRENT_STATUS 
FROM TABLEA CCP 

Puis-je ajouter une condition Else pour les clients "Fermé"?

+0

Cela semble être un problème XY. Est-ce que votre objectif est de savoir si les ID ont une date de fin nulle (ou peut-être une date de fin qui n'est pas encore passée, alors tous les enregistrements sont-ils fermés?) (Qu'est-ce qui arrive à la date de fin Id2? envelopper le maximum dans un coalesce et utilisé 'fermé'? – xQbert

+0

Cas _expression_, pas de déclaration. – jarlh

Répondre

0

Peut-être:

SELECT * 
coalesce(MAX(CASE WHEN CCP.ENDDATE IS NULL THEN 'Active' END) 
     OVER (PARTITION BY CCP.ID),'Closed') AS CURRENT_STATUS 
FROM TABLEA CCP 

Ou si vous avez des situations où la date de fin est à l'avenir et que vous avez besoin de ces enregistrements à être actif ...

Cette approche dit que si une ID a une extrémité null date à laquelle il doit encore être actif si un identifiant a une date de fin qui est dans le futur, il doit toujours être actif.

La sous-requête identifie tous les identifiants qui sont "actifs" en fonction de la date de clôture non close ou de la fin; et si un tel enregistrement existe, nous utilisons un cas pour soit mettre tous ces identifiants soit actifs ou fermés.

SELECT A1.StartDate 
    , A1.EndDate 
    , A1.ID 
    , case when A2.ID is not null then 'Active' Else 'Closed' end As currentStatus 
FROM TableA A1 
INNER JOIN (SELECT Distinct ID 
      FROM TableA 
      WHERE EndDate is null or EndDate>=Sysdate()) A2 
on A1.ID = A2.ID 
0

Si le champ StartDate est fiable émis une valeur EndDate avant d'être émis une autre StartDate (ce qui est indiqué par le petit jeu de données référencé dans la question), puis une solution simple consiste à utiliser une instruction CASE pouvez vérifie si un NULL enddate existe pour l'ID donné:

SELECT StartDate, EndDate, ID 
     ,CASE WHEN EXISTS (SELECT EndDate 
          FROM TABLEA T2 
          WHERE T2.ID = T1.ID AND T2.EndDate IS NULL) 
      THEN 'Active' 
      ELSE 'Closed' 
     END AS [Current Status] 
    FROM TABLEA T1