SQL-запрос для суммирования полей из разных таблиц

Я скромный программист, который ненавидит 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

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

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 ненавидит меня).

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


person Ignacio Soler Garcia    schedule 20.02.2010    source источник


Ответы (5)


Или вы можете воспользоваться преимуществами использования подзапросов:

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
person odiseh    schedule 20.02.2010
comment
Мне очень понравился ваш подход. Чисто, просто... и это работает! Спасибо .. но я все еще ненавижу SQL: P - person Ignacio Soler Garcia; 20.02.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;
person a'r    schedule 20.02.2010
comment
Это лучший ответ, так как этот запрос должен выполняться быстрее, поскольку он может быть оптимизирован SQL Server, поскольку он не содержит вложенных запросов. - person Mohamed Nagieb; 07.02.2021

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

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

person Jahson kyalo    schedule 20.05.2016

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

SELECT Total=(Select Sum(Amount) from table a)+(Select Sum(Amount) from table b)+(Select Sum(Amount) from table c)
person user3127648    schedule 07.01.2016

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

person mitul    schedule 27.12.2017