SQL-запрос для суммирования полей из разных таблиц - PullRequest
5 голосов
/ 20 февраля 2010

Я скромный программист, который ненавидит SQL ... :) Пожалуйста, помогите мне с этим запросом.

У меня есть 4 таблицы, например:

Table A:
Id Total
1  100
2  200
3  500

Table B
ExtId  Amount
1      10
1      20
1      13
2      12
2      43
3      43
3      22

Table C
ExtId  Amount
1      10
1      20
1      13
2      12
2      43
3      43
3      22

Table D
ExtId  Amount
1      10
1      20
1      13
2      12
2      43
3      43
3      22

Мне нужно сделать SELECT, который показывает Id, Total и SUM полей Amount таблиц B, C и D следующим образом:

Id Total AmountB AmountC AmountD
1  100   43      43      43
2  200   55      55      55
3  500   65      65      65

Я попробовал с внутренним объединением трех таблиц по Id и сделал сумму полей суммы, но результаты не являются точными. Вот неправильный запрос:

SELECT     dbo.A.Id, dbo.A.Total, SUM(dbo.B.Amount) AS Expr1, SUM(dbo.C.Amount) AS  Expr2, SUM(dbo.D.Amount) AS Expr3
FROM         dbo.A INNER JOIN
                  dbo.B ON dbo.A.Id = dbo.B.ExtId INNER JOIN
                  dbo.C ON dbo.A.Id = dbo.C.ExtId INNER JOIN
                  dbo.D ON dbo.A.Id = dbo.D.ExtId
GROUP BY dbo.A.Id, dbo.A.Total

Заранее спасибо, просто я ненавижу SQL (или что SQL ненавидит меня).

РЕДАКТИРОВАТЬ: У меня была опечатка. Этот запрос не дает правильных результатов. Расширен пример.

Ответы [ 5 ]

18 голосов
/ 20 февраля 2010

Или вы можете воспользоваться SubQueries:

select A.ID, A.Total, b.SB as AmountB, c.SC as AmountC, d.SD as AmountD
from A
  inner join (select ExtID, sum(Amount) as SB from B group by ExtID) b on A.ID = b.ExtID
  inner join (select ExtID, sum(Amount) as SC from C group by ExtID) c on c.ExtID = A.ID
  inner join (select ExtID, sum(Amount) as SD from D group by ExtID) d on d.ExtID = A.ID
2 голосов
/ 20 февраля 2010

Из вашего описания этот запрос должен выдать ошибку, так как вы используете несуществующий столбец dbo.A.Amount в вашей группе по. Изменение этого значения на dbo.A.Total может быть тем, что вам нужно.

Если вам нужны все суммы вместе, попробуйте этот запрос:

select A.Id, A.Total, sum(B.Amount + C.Amount + D.Amount) AS Total_Amount
from A
  inner join B on A.Id = B.ExtId
  inner join C on A.Id = C.ExtId
  inner join D on A.Id = D.ExtId
group by A.Id, A.Total;
1 голос
/ 20 мая 2016

Этот тоже хорошо работает

SELECT (SELECT SUM(Amount) FROM TableA) AS AmountA, (SELECT SUM(Amount) FROM TableB) AS AmountB, (SELECT SUM(Amount) FROM TableC) AS AmountC, (SELECT SUM(Amount) FROM TableD) AS AmountD

0 голосов
/ 27 декабря 2017

Попробуйте этот код SELECT Total = isnull ((выберите сумму (Isnull (сумма, 0)) из таблицы a), 0) + isnull ((выберите сумму (isnull (количество, 0)) из таблицы b), 0) + isnull ((выберите сумму (isnull (Amount, 0)) из таблицы c), 0)

0 голосов
/ 07 января 2016

Это может помочь другим пользователям.

SELECT Total=(Select Sum(Amount) from table a)+(Select Sum(Amount) from table b)+(Select Sum(Amount) from table c)
...