#sql #sql-server #sql-server-2005 #syntax
#sql #sql-сервер #sql-server-2005 #синтаксис
Вопрос:
Хорошо, у меня есть две таблицы.
Таблица IDAssoc содержит столбцы bill_id
, year
, area_id
.
Таблица Bill содержит столбцы bill_id
, year
, main_id
и amount_due
.
Я пытаюсь получить сумму amount_due
столбца из таблицы bill для каждого из связанных area_ids в таблице IDAssoc.
Я выполняю оператор select для выбора суммы и объединения в bill_ids. Как я могу настроить это так, чтобы у него была одна строка для каждого из связанных счетов в каждом area_id из таблицы assoc. С каждым area_id может быть связано три или четыре идентификатора bill_id, и мне нужно, чтобы они суммировались для каждого и возвращались, чтобы я мог использовать этот select в другом операторе. У меня есть group by, настроенная для area_id, но она по-прежнему возвращает каждую строку и не суммирует их для каждого area_id. У меня уже есть year и main_id, указанные в предложении where, чтобы вернуть нужные данные, но я не могу заставить sum работать должным образом. Извините, я все еще учусь, и я не уверен, как это сделать. Спасибо!
Редактировать — В основном запрос, который я пытаюсь выполнить до сих пор, в основном похож на тот, который опубликован ниже:
select a.area_id, sum(b.amount_due)
from IDAssoc a
inner join Bill b
on a.bill_id = b.bill_id
where Bill.year = 2006 and bill.bill_id = 11111
Это просто произвольные числа.
Возвращаемые данные выглядят следующим образом:
amount_due — area_id
.05 1003
.15 1003
.11 1003
65 1004
55 1004
Мне нужна одна строка, возвращаемая для каждого area_id с суммированным значением amount_due. area_id находится только в таблице assoc, а не в таблице bill.
Комментарии:
1. Возможно, вы захотите опубликовать любой SQL, который вы пробовали до сих пор.
2. Можете ли вы показать свои текущие данные и желаемые результаты?
Ответ №1:
select a.area_id, sum(b.amount_due)
from IDAssoc a
inner join Bill b
on a.bill_id = b.bill_id
where b.year = 2006 and b.bill_id = 11111
group by a.area_id
Возможно, вы захотите изменить inner join
на left join
, если у одного IDAssoc
может быть много или нет Bill
:
select a.area_id, coalesce(sum(b.amount_due),0)
from IDAssoc a
left join Bill b
on a.bill_id = b.bill_id
where b.year = 2006 and b.bill_id = 11111
group by a.area_id
Комментарии:
1. Это все еще возвращает отдельные строки и не суммирует мои данные. Необходимо суммировать все счета в каждом area_id и возвращать его в одной строке с соответствующим area_id. Это возвращает, например, 4 строки с произвольными суммами и одним и тем же area_id, когда это должна быть одна строка и один area_id. На самом деле существует 4-5 разных area_ids, которым необходимо суммировать несколько связанных счетов.
2. Левое соединение также не помогло, по-прежнему возвращает несколько строк для каждого area_id, когда они должны быть суммированы.
3. Моя ошибка, я пропустил
group by
предложение4. Это сработало, у меня действительно был правильный запрос, но я включил сумму в group by, и это все испортило. Я все еще учусь, и теперь это имеет смысл, но спасибо, что помогли мне добраться до этого момента. Теперь это работает.
Ответ №2:
Вам не хватает GROUP BY
предложения:
SELECT a.area_id, SUM(b.amount_due) TotalAmount
FROM IDAssoc a
LEFT JOIN Bill b
ON a.bill_id = b.bill_id
GROUP BY a.area_id
Комментарии:
1. У меня есть group by, я включил причитающуюся сумму в group by вместе с идентификатором области, и это все испортило, когда я убрал это из группы, поскольку мой исходный запрос сработал. Спасибо за вашу помощь, чтобы я мог разобраться в этом.