2017-10-18 8 views
1

Mon problème est que cette requête ne fonctionne que si la table MainRule a un ID qui correspond à la table Table1. J'ai besoin que la requête fonctionne même si la table MainRule n'a pas d'ID correspondant. Les enregistrements de Table1 doivent s'afficher même s'il n'y a pas d'enregistrement (s) correspondant dans la table MainRule.Mes données ne seront pas affichées à moins qu'il y ait une correspondance entre les deux tables

Voici mon code:

SELECT Person, OrderNum, Name, County, SubmitDate, Days1, 
     SUM(Date_Diff) - 1 AS [Number of Uncleared Days] 
    From 
    (SELECT D1.RecordID AS Person, D3.[case no] AS OrderNum, 
      D3.FullName AS Name, D3.County, D3.[SignedDate] AS SubmitDate, 
        DATEDIFF(d, D3.[SignedDate], D3.closedate) AS Days1, 
        DATEDIFF(DAY, [HoldDate], 
        (SELECT TOP 1 [StatusDate] 
        FROM [MainRule] D2 
        WHERE D2.Status = 'Cleared' 
         AND D1.RecordID = D2.RecordID 
         AND D1.StatusDate < D2.StatusDate)) AS [Date_Diff] 
     FROM [MainRule] AS D1 INNER JOIN table1 AS D3 ON D3.ID = D1.RecordID 
     WHERE D1.Status = 'UnCleared') SubQ 
WHERE (SubmitDate BETWEEN '10/01/2017' and '10/17/2017') 
GROUP BY Person, OrderNum, Name, County, SubmitDate, Days1 
+1

Ensuite, vous devez utiliser Table1 comme racine de votre requête et gauche rejoindre MainRule. –

Répondre

0

Vous avez deux problèmes: le INNER JOIN (comme expliqué par l'autre réponse) et le WHERE D1.Status = 'UnCleared'.

Quelle que soit votre jointure, cette clause WHERE va exclure les lignes sans ligne MainRule correspondante. Essayez quelque chose comme WHERE D1.Status = 'UnCleared' OR D1.Status IS NULL.

+0

Oui !!!! C'est tout. Vous etes tous les meilleurs!!! – tnbumbray

2

Il suffit d'utiliser LEFT JOIN à la place:

SELECT Person, OrderNum, Name, County, SubmitDate, Days1, 
     SUM(Date_Diff) - 1 AS [Number of Uncleared Days] 
    From 
    (SELECT D1.RecordID AS Person, D3.[case no] AS OrderNum, 
      D3.FullName AS Name, D3.County, D3.[SignedDate] AS SubmitDate, 
        DATEDIFF(d, D3.[SignedDate], D3.closedate) AS Days1, 
        DATEDIFF(DAY, [HoldDate],              
        (SELECT TOP 1 [StatusDate] 
        FROM [MainRule] D2 
        WHERE D2.Status = 'Cleared' 
         AND D1.RecordID = D2.RecordID 
         AND D1.StatusDate < D2.StatusDate)) AS [Date_Diff] 
     FROM table1 AS D3 
     LEFT JOIN [MainRule] AS D1 ON D3.ID = D1.RecordID 
     WHERE D1.Status = 'UnCleared') SubQ 
WHERE (SubmitDate BETWEEN '10/01/2017' and '10/17/2017') 
GROUP BY Person, OrderNum, Name, County, SubmitDate, Days1 

De cette façon, vous obtiendrez toutes les lignes de MainRule (la table de gauche), même s'il n'y a pas correspondance rangée dans l'autre tableau table1.

Vous devriez en savoir plus sur la différence entre les types de jointure:

+0

En fait, j'ai besoin que ce soit l'inverse. J'ai besoin des lignes de table1, même s'il n'y a pas de lignes correspondantes dans la table MainRule. – tnbumbray

+0

@tnbumbray alors basculez les deux tables dans la requête. –

+0

J'ai essayé et ça ne marche toujours pas. Je sais qu'il y a des données dans la table 1 parce que quand j'enlève la sous-requête du milieu, j'obtiens des données. – tnbumbray