Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2005 Forums
 Transact-SQL (2005)
 DateAdd containing aggregate

Author  Topic 

SirRawlins
Starting Member

14 Posts

Posted - 2010-11-29 : 13:25:13
Hello Guys,

I have the following query which I'm looking to amend slightly.

http://pastebin.com/QWwkdNxL

You'll notice at the moment that we have the lines as follows in the select statement:

IsNull(SUM(Delay.Days), 0) + Courier.LeadDays AS TotalLeadDays,
MAX(DATEADD(D, Courier.LeadDays, SaleOrderItem.GoodsReceived)) AS DueDate

What I want to do is perform the DateAdd with the TotalLeadDays value in place of the CourierLeadDays value, something like:

MAX(DATEADD(D, (isNull(SUM(Delay.Days), 0) + Courier.LeadDays), SaleOrderItem.GoodsReceived)) AS DueDate

However, doing to throws an error telling me:

Msg 130, Level 15, State 1, Line 15
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

Can anyone give me some help on how to restructure this?

Thanks,

Robert

yosiasz
Master Smack Fu Yak Hacker

1635 Posts

Posted - 2010-11-29 : 13:59:51
sir Rawlings

how about using a common table expression? Will this work?

WITH cteSir(SaleOrder_number, TotalLeadDays, DueDate)
Select SaleOrder.SaleOrder_number,
IsNull(SUM(Delay.Days), 0) + Courier.LeadDays As TotalLeadDays,
DATEADD(D, Courier.LeadDays, SaleOrderItem.GoodsReceived) DueDate
From SaleOrder
Inner Join SaleOrderItem
On SaleOrder.SaleOrder_ID = SaleOrderItem.SaleOrder_ID
and SaleOrderItem.SaleOrder_ID not in (
Select SaleOrder_ID
From SaleOrderItem SOInner
Where SOInner.Courier_ID is null
Or SOInner.GoodsReceived is null
)
/* Find any deliveries which are related to this order and courier. */
Left Outer Join Delivery
On SaleOrder.SaleOrder_ID = Delivery.SaleOrder_ID
And Delivery.Courier_ID = SaleOrderItem.Courier_ID
/* Check which delivery delays have been enetered for this item. */
Left Outer Join Delivery_Delay_Lnk_Item
On SaleOrderItem.SaleOrderItem_ID = Delivery_Delay_Lnk_Item.Item_ID
Left Join Delay
On Delivery_Delay_Lnk_Item.Delay_ID = Delay.Delay_ID
/* Determine the courier for the item. */
Inner Join Courier
On SaleOrderItem.Courier_ID = Courier.Courier_ID
/* Check the order is alive and active. */
Where SaleOrder.Placed IS NOT NULL
And SaleOrder.Active = 1
And SaleOrder.Canceled IS NULL
/* Check that the order has not yet been delievred. */
And Delivery.Delivered IS NULL
Group By SaleOrder.SaleOrder_Number,
Courier.LeadDays
)
SELECT SaleOrder_number,
TotalLeadDays,
MAX(DueDateOrder)
FROM cteSir
ORDER BY DueDate ASC


If you don't have the passion to help people, you have no passion
Go to Top of Page
   

- Advertisement -