Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Объединение с суммированием
 
 автор: Stanislav   (03.04.2011 в 07:59)   личное сообщение
 
 

Есть два запроса, выводящие список должников: ID должника, Сумма задолженности.


SELECT Sale.CustomerContactID, Sum(nz([ProductCost],0)+nz([DeliveryCost],0)+nz([PaymentCollectionCost],0)+nz([OtherCosts],0)+nz([Tax],0)) AS Debt
FROM Sale
GROUP BY Sale.CustomerContactID, Sale.IsPaymentReceived
HAVING (((Sale.IsPaymentReceived)=False));



SELECT OwnershipTransfer.ContactID, Sum(nz([ProductsCost],0)+nz([OtherCosts],0)+nz([Tax],0)) AS Debt
FROM OwnershipTransfer
GROUP BY OwnershipTransfer.ContactID, OwnershipTransfer.IsPaymentReceived
HAVING (((OwnershipTransfer.IsPaymentReceived)=False));


Как их объединить с суммированием второго поля (сумма задолженности)? Пытаюсь через UNION - постоянно ругается, что ContactID не включен как вычисляемое выражение.

SELECT CustomerContactID AS Contact, Sum([Debt]) AS SumOfDebt
FROM DebtSale
UNION SELECT ContactID AS Contact, Sum([Debt]) AS SumOfDebt
FROM DebtOwnershipTransfer
GROUP BY Contact, SumOfDebt;

Заранее спасибо.

  Ответить  
 
 автор: Гоблин   (03.04.2011 в 09:43)   личное сообщение
 
 

Кинь таблички с запросами. По первому запросу сумма сумм что ли получается? Там и так одни сложения, куда же еще суммировать по группировке?
Может лучше сначала объединить, а потом суммировать и группировать.

  Ответить  
 
 автор: Stanislav   (03.04.2011 в 18:49)   личное сообщение
17 Кб.
 
 

Пожалуйста. В таблице Sale стоимость покупки складывается из нескольких валютных полей: стоимость продукции, доставки, сбора наложенного платежа, налога. В таблице OwnershipTransfer аналогично, только полей меньше. Поэтому и в первом DebtSale и во втором запросе DebtOwnershipTransfer я сначал суммирую валютные поля, чтобы получить стоимость покупки, а потом суммирую по группировке, так как я группирую контакты, потому что мне надо знать сколько должен каждый покупатель.
А теперь я пытаюсь объединить запросы DebtSale и DebtOwnershipTransfer, чтобы знать сколько должен каждый покупатель за Sale и OwnershipTransfer сразу. Но не получается.

  Ответить  
 
 автор: Гоблин   (03.04.2011 в 19:30)   личное сообщение
24 Кб.
 
 

Разложил запрос и получил следующее:
Запрос на объединение состоит из 2 запросов. В одном 3 поля в другом 2 - ошибка №1
Прчем в первом запросе где 3 поля есть вообще несуществующее поле, оно и мешает.
В первом запросе поле Contact:IdContact выражение. Да еще с группового запроса DebOwnershipTransfert
В общем сделай так. Сначала сделай сумму полей в простом запросе. В другом запросе сгруппируй по параметру
и вычисляемое поле поставь Sum.
И потом порядок типов полей 2х запросов должен совпадать. А то получается, что поле ID группируется с
вычисляемым полем.
В общем запрос DebtUnion получился с 2-х полей в таком виде=>

Да и еще. В таблице Sale есть поле DocumentStatusID и CustomerContactID источником которых выступает несуществующее что-то. Это тоже дает ошибку. В общем проверь все источники полей, найди несуществующее, возможно удалено из базы, а в источниках не исправил.

  Ответить  
 
 автор: Stanislav   (04.04.2011 в 05:23)   личное сообщение
17 Кб.
 
 

Несуществующее поле не нашел. Как называется поле и в какой оно таблице? А то что где-то источник данных ссылается на несуществующие таблицы - это программе по барабану. Это влияет только на отображение таблиц - вместо имен отображается ID. Я просто не импортировал эти таблицы в пример, поэтому Акс и показывает, что их нет.
Я посмотрел твой пример Union - там как раз нет того что мне надо - слияния одинаковых контактов и суммирования долгов одинаковых контактов.
Попробовал сделать сумму полей в 2 запросах, а потом объединить их - результат тот же - не могу объединить.
Попробую еще раз сформулировать задачу, прежде всего для себя, потому что верно поставленная задача - половина дела.
Итак, у нас есть 2 запроса


SELECT OwnershipTransfer.ContactID, nz([ProductsCost],0)+nz([OtherCosts],0)+nz([Tax],0) AS Debt
FROM OwnershipTransfer;



SELECT Sale.ContactID, nz([ProductCost],0)+nz([DeliveryCost],0)+nz([PaymentCollectionCost],0)+nz([OtherCosts],0)+nz([Tax],0) AS Debt
FROM Sale;


Запросы выдают 2 поля: ContactID, Debt. Требуется написать запрос, производящий слияние поля ContactID и суммирование поля Debt для строк, подвергающихся слиянию.

Если мы напишем вот так:

SELECT ContactID
FROM DebtSale
UNION SELECT ContactID
FROM DebtOwnershipTransfer;


то получим:


ContactID
129
272
303



А если мы напишем вот так:

SELECT ContactID, Debt
FROM DebtSale
UNION SELECT ContactID, Debt
FROM DebtOwnershipTransfer;


то получим следующее:


ContactID Debt
129 15172
272 28990
303 15120
303 15130
303 15540
303 25210
303 30345



Очевидно, что поле Debt препятствует слиянию одинаковых значений поля ContactID, поскольку содержит в себе разные значения.

Вопрос: как подвергнуть слиянию поле ContactID, просуммировав при этом значения поля Debt?

Если я пытаюсь делать вот так:

SELECT ContactID, Sum(Debt) AS SumOfDebt
FROM DebtSale
UNION SELECT ContactID, Sum(Debt) AS SumOfDebt
FROM DebtOwnershipTransfer;


то получаю ошибку: "Вы пытаетесь выполнить запрос, в котором нет выражения ContactID как части вычисляемой функции."

Если делаю так:

SELECT ContactID, Sum(Debt) AS SumOfDebt
FROM DebtSale
GROUP BY ContactID
UNION SELECT ContactID, Sum(Debt) AS SumOfDebt
FROM DebtOwnershipTransfer
GROUP BY ContactID;


то получаю:

ContactID    SumOfDebt
129    15172
272    28990
303    25210
303    76135


такой результат недостаточен, потому что поля ContactID, Debt были подвергнуты слиянию (группировке) и суммированию в рамках составных частей запроса UNION, но не были подвергнуты слиянию и суммированию в самом запросе UNION.

  Ответить  
 
 автор: Stanislav   (04.04.2011 в 05:38)   личное сообщение
18 Кб.
 
 

И, наконец, вот оно решение. Сгруппируем и просуммируем наш запрос UNION:


SELECT DebtUnion.ContactID, Sum(DebtUnion.SumOfDebt) AS SumOfSumOfDebt
FROM DebtUnion
GROUP BY DebtUnion.ContactID;


получаем:

ContactID    SumOfSumOfDebt
129    15172
272    28990
303    101345


  Ответить  
 
 автор: Гоблин   (04.04.2011 в 18:23)   личное сообщение
 
 

Ну поздравляю. Только у меня получилось

Sum-Debt CustomerContactID
15172 129
25210 303
28990 272
76135 303


Где-то ошибка в 303, Надо сгруппировать по этому параметру и суммировать. В итоге результат совпадает.

  Ответить  
 
 автор: ser60   (04.04.2011 в 19:58)   личное сообщение
 
 

а UNION ALL не пойдет?

  Ответить  
 
 автор: Гоблин   (04.04.2011 в 20:28)   личное сообщение
 
 

Так у тебя вроде все получилось, чего еще мудрить? У меня запрос на объединение 2 групповых. Поэтому разделение произошло. Теперь этот запрос надо впихать в групповой с суммированием и все. Получим тот же самый результат.

  Ответить  
 
 автор: Stanislav   (05.04.2011 в 12:53)   личное сообщение
 
 

Так это не я, это он - ser60

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList