2016-09-23 6 views
0

У меня есть две таблицы, которые выглядят примерно так:Как SUM только один раз на UniqueId в SQL?

Таблица A

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

и Таблица 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 

Я хотел бы финальный стол, чтобы выглядеть примерно так:

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

Я пробовал следующее и не работает:

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

Любые идеи? Заранее спасибо

+0

Вы должны прочитать о 'GROUP BY'. – DavidG

+0

Это дата или дата? – GuidoG

+0

Как результат будет? не могли бы вы объяснить. – Susang

ответ

1

вы можете использовать отчетливый

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 

результатом этого будет отличаться, если NetFinanced сумма меняется в SnapshotTimeId

, если вы хотите получить самые последние NetFinanced сумму, вы можете использовать row_number (), чтобы упорядочить значения.

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

У вас есть повторяющиеся значения для NetFinanced в TableB, конечно, результаты не дадут вам то, что вы хотите. Вы должны присоединиться к TABLEA с уникальными значениями (я предполагаю) из ContractId и NetFinanced колонн из 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

Попробуйте Как это

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