2016-09-23 1 views
0

J'ai deux tables qui ressemblent à peu près comme ceci:Comment SUM seule une fois par UniqueId dans SQL?

Tableau A

DocumentId (*is unique) DocumentDate 
1      2016-01-01 
2      2016-01-01 
3      2016-02-01 
4      2016-03-01 

et le tableau B

ContractId SnapshotTimeId NetFinanced 
1   20160231  300 
1   20160331  300 
1   20160431  300 
2   20160231  450 
2   20160331  450 
2   20160431  450 
3   20160331  500 
3   20160431  500 
4   20160431  150 

je voudrais la table finale à ressembler à quelque chose comme ceci:

DocumentDate NetFinanced 
2016-01-01 750 
2016-02-01 500 
2016-03-01 150 

J'ai essayé ce qui suit et cela ne fonctionne pas:

SELECT A.DocumentDate, SUM(B.NetFinanced) 
FROM A 
JOIN B on B.ContractId=A.DocumentId 
GROUP BY A.DocumentDate 

Des idées? Merci à l'avance

+0

Vous devriez lire 'GROUP BY'. – DavidG

+0

est-ce un datetime ou un champ de date? – GuidoG

+0

Comment la sortie sera-ce? Pouvez-vous s'il vous plaît expliquer. – Susang

Répondre

1

vous pouvez utiliser distincts

SELECT A.DocumentDate, 
     SUM(B.NetFinanced) 
FROM A 
     JOIN (SELECT DISTINCT 
         ContractId, 
         NetFinanced 
       FROM  B 
      ) B ON B.ContractId = A.DocumentId 
GROUP BY A.DocumentDate 

le résultat de ce sera différent si le montant NetFinanced change par SnapshotTimeId

si vous voulez la dernière quantité NetFinanced, vous pouvez utiliser ROW_NUMBER () pour commander les valeurs.

SELECT A.DocumentDate, 
     SUM(B.NetFinanced) 
FROM A 
     JOIN (SELECT ROW_NUMBER() OVER (PARTITION BY ContractId ORDER BY SnapshotTimeId DESC) Rn, 
         ContractId, 
         NetFinanced 
       FROM  B 
      ) B ON B.ContractId = A.DocumentId AND B.Rn = 1 
GROUP BY A.DocumentDate 
0

Vous avez des valeurs en double pour NetFinanced en TableB, bien sûr, les résultats ne seront pas vous donner ce que vous voulez. Vous devez joindre TableA avec les valeurs uniques (je suppose) de ContractId et NetFinanced colonnes de TableB:

SELECT A.DocumentDate, 
     SUM(B.NetFinanced) NetFinanced 
FROM dbo.TableA A 
INNER JOIN (SELECT DISTINCT ContractId, NetFinanced 
      FROM dbo.TableB) B 
    ON A.DocumentId = B.ContractId 
GROUP BY A.DocumentDate; 
0

Essayez Vous aimez cette

SELECT A.DocumentDate, SUM(B.NetFinanced) 
FROM A 
JOIN (SELECT MAX(ContractId) ContractId, MAX(SnapshotTimeId)SnapshotTimeId, 
      MAX(NetFinanced)NetFinanced 
     FROM B GROUP BY ContractId) B ON B.ContractId = A.DocumentId 
GROUP BY A.DocumentDate