Friday, March 9, 2012

Error Msg 8120

Hello all,

I am using SQL Server 2005 Express on my local machine and am having a hard time figuring out why this problem is occuring. I am creating a stored procedure just fyi. 8120 = Column 's.Spread' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. And also...Column 's.Pay End Dt' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Both of these fields are being used in an expression not actually pulled into the query. I have bolded the line that the error refers to...Here is the sql:

USE ForecastSQLDBA
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE GetHistoricalData
@.AccountName varchar(50),
@.MaxDate smalldatetime
AS
BEGIN

SELECTDivision,
SUM(CASE WHEN [Pay End Dt] BETWEEN '2005-01-01' AND '2005-12-31' THEN Spread ELSE 0 END) AS [05Spread],
SUM(CASE WHEN [Pay End Dt] BETWEEN '2006-01-01' AND '2006-12-31' THEN Spread ELSE 0 END) AS [06Spread],
SUM(CASE WHEN [Pay End Dt] BETWEEN '2005-01-01' AND '2005-12-31' THEN [Bill] ELSE 0 END)/SUM(CASE WHEN [Pay End Dt] BETWEEN '2005-01-01' AND '2005-12-31' THEN [Cost] ELSE 0 END) AS [05MarkUp],
SUM(CASE WHEN [Pay End Dt] BETWEEN '2006-01-01' AND '2006-12-31' THEN [Bill] ELSE 0 END)/SUM(CASE WHEN [Pay End Dt] BETWEEN '2006-01-01' AND '2006-12-31' THEN [Cost] ELSE 0 END) AS [06MarkUp],
SUM(CASE WHEN [Pay End Dt] BETWEEN '2007-01-01' AND @.maxdate THEN [Bill] ELSE 0 END)/SUM(CASE WHEN [Pay End Dt] BETWEEN '2007-01-01' AND @.maxdate THEN [Cost] ELSE 0 END) AS [07MarkUp],
SUM(CASE WHEN [Pay End Dt] BETWEEN '2005-01-01' AND '2005-12-31' THEN Spread ELSE 0 END)/SUM(CASE WHEN [Pay End Dt] BETWEEN '2005-01-01' AND '2005-12-31' THEN [Emp] ELSE 0 END) AS [05SPC],
SUM(CASE WHEN [Pay End Dt] BETWEEN '2006-01-01' AND '2006-12-31' THEN Spread ELSE 0 END)/SUM(CASE WHEN [Pay End Dt] BETWEEN '2006-01-01' AND '2006-12-31' THEN [Emp] ELSE 0 END) AS [06SPC],
SUM(CASE WHEN [Pay End Dt] BETWEEN '2007-01-01' AND @.maxdate THEN Spread ELSE 0 END)/SUM(CASE WHEN [Pay End Dt] BETWEEN '2007-01-01' AND @.maxdate THEN [Emp] ELSE 0 END) AS [07SPC],
SUM(CASE WHEN [Pay End Dt] = @.maxdate THEN [Bill] ELSE 0 END)/SUM(CASE [Pay End Dt] WHEN @.maxdate THEN [Cost] ELSE 0 END) AS [07CurMarkUp],
AVG(CASE WHEN [Pay End Dt] BETWEEN '2005-01-01' AND '2005-12-31' THEN [Emp] ELSE 0 END) AS [05AvgEmp],
AVG(CASE WHEN [Pay End Dt] BETWEEN '2006-01-01' AND '2006-12-31' THEN [Emp] ELSE 0 END) AS [06AvgEmp],
AVG(CASE WHEN [Pay End Dt] BETWEEN '2007-01-01' AND @.maxdate THEN [Emp] ELSE 0 END) AS [07AvgEmp],
MAX(CASE WHEN [Pay End Dt] BETWEEN '2005-01-01' AND '2005-12-31' THEN [Spread] ELSE 0 END) AS [05High],
MAX(CASE WHEN [Pay End Dt] BETWEEN '2006-01-01' AND '2006-12-31' THEN Spread ELSE 0 END) AS [06High],
MAX(CASE WHEN [Pay End Dt] BETWEEN '2007-01-01' AND @.maxdate THEN Spread ELSE 0 END) AS [07High],
CASE Spread WHEN MAX(CASE WHEN [Pay End Dt] BETWEEN '2005-01-01' AND '2005-12-31' THEN Spread ELSE 0 END) THEN [Pay End Dt] ELSE '' END AS [05MaxWeek],
CASE Spread WHEN MAX(CASE WHEN [Pay End Dt] BETWEEN '2006-01-01' AND '2006-12-31' THEN Spread ELSE 0 END) THEN [Pay End Dt] ELSE '' END AS [06MaxWeek],
CASE Spread WHEN MAX(CASE WHEN [Pay End Dt] BETWEEN '2007-01-01' AND @.maxdate THEN Spread ELSE 0 END) THEN [Pay End Dt] ELSE '' END AS [05MaxWeek]

FROM (SELECT Division, [Pay End Dt], Sum(isnull([SumOfNum of Emp],0)) AS Emp, SUM(isnull([SumOfNet Spread],0)) AS Spread, SUM(isnull([SumOfTotal Bill],0)) AS Bill, SUM(isnull([SumOfCost],0)) AS Cost FROM dbo.tbl_NAHistory WHERE [Generic Customer] = @.AccountName GROUP BY Division, [Pay End Dt]) AS s

GROUP BY [Division];
END

Thanks in advance,
-BOK, I was wrong...the last three CASE expressions need to go in the GROUP BY but they can't because they have aggregates. Any ideas?

No comments:

Post a Comment