Francisco H Tapia
my.lists at verizon.net
Wed May 26 17:21:38 CDT 2004
I did this with a cursor in the end... :( I'm sure there IS a way to do this otherwise, but I haven't invested more time into it, plus this makes it usable it returns the recordset in under 3 seconds so it seems fine, tho I would prefer a NON-CURSOR approach. :\ oh well. Here is the syntax that I used.. (WATCH FOR WRAP) -- Purpose: Select only the TOP 2 of each group Model for display -- -- DECLARE @varModel as VarChar(100) DECLARE curModels CURSOR FOR SELECT dbo.Models.Models AS Model FROM dbo.Frames INNER JOIN dbo.Models ON dbo.Frames.Model = dbo.Models.modelsID INNER JOIN dbo.Holding ON dbo.Frames.[S/N] = dbo.Holding.SN WHERE (dbo.Frames.[Start Date] > GETDATE() - 60) AND (dbo.Frames.Dealer = N'stock') AND (dbo.Models.Frames <> N'Machine Accessories') AND (dbo.Holding.[Hold For] IS NULL) AND (dbo.Models.Models <> N'TL-3') AND (dbo.Models.Models <> N'MDC') AND (dbo.Models.Models <> N'EC-300') AND (NOT (dbo.Models.Models LIKE N'%CE')) AND (NOT (dbo.Models.Models LIKE N'%HE')) Group BY dbo.Models.models CREATE TABLE #tmpTable (Model VARCHAR(100), Frame VARCHAR(100), [Est. Completion] VARCHAR (100), [Cast/Ctrl Ops] VARCHAR(255) ) OPEN curModels FETCH NEXT FROM curModels INTO @varModel WHILE (@@Fetch_Status = 0) BEGIN INSERT INTO #tmpTable (Model, Frame, [Est. Completion], [Cast/Ctrl Ops]) SELECT TOP 2 dbo.Models.Models AS Model, dbo.Models.Frames AS Frame, dbo.prodDate(dbo.Frames.[Start Date] + 3, GETDATE()) AS [Est. Completion], ISNULL(dbo.Frames.[Cast/Ctrl Ops], '') AS [Cast/Ctrl Ops] FROM dbo.Frames INNER JOIN dbo.Models ON dbo.Frames.Model = dbo.Models.modelsID INNER JOIN dbo.Holding ON dbo.Frames.[S/N] = dbo.Holding.SN WHERE (dbo.Frames.[Start Date] > GETDATE() - 60) AND (dbo.Frames.Dealer = N'stock') AND (dbo.Models.Frames <> N'Machine Accessories') AND (dbo.Holding.[Hold For] IS NULL) AND (dbo.Models.Models <> N'TL-3') AND (dbo.Models.Models <> N'MDC') AND (dbo.Models.Models <> N'EC-300') AND (NOT (dbo.Models.Models LIKE N'%CE')) AND (NOT (dbo.Models.Models LIKE N'%HE')) AND dbo.Models.Models = @varModel ORDER BY dbo.Models.Models, dbo.Frames.[Start Date] FETCH NEXT FROM curModels INTO @varModel END CLOSE curModels DEALLOCATE curModels SELECT * FROM #tmpTable ORDER BY #tmpTable.Model Drop TABLE #tmpTable Billy Pang wrote On 5/26/2004 2:22 PM: > How about... > > SET NOCOUNT ON > DECLARE @ttt TABLE(THE_ID INT NOT NULL IDENTITY(1,1), THE_GROUP > CHAR(1), THE_VALUE INT); > > INSERT INTO @ttt VALUES('A',1); > INSERT INTO @ttt VALUES('A',3); > INSERT INTO @ttt VALUES('A',5); > > INSERT INTO @ttt VALUES('B',2); > INSERT INTO @ttt VALUES('B',4); > INSERT INTO @ttt VALUES('B',5); > > SELECT X.THE_GROUP > , (SELECT TOP 1 B.THE_VALUE FROM @ttt B WHERE B.THE_GROUP = > X.THE_GROUP ORDER BY B.THE_VALUE) AS THE_FIRST_VALUE_FOR_THIS_GROUP > , (SELECT TOP 1 C.THE_VALUE FROM @ttt C WHERE C.THE_GROUP = > X.THE_GROUP AND C.THE_ID NOT IN (SELECT TOP 1 D.THE_ID FROM @ttt D > WHERE D.THE_GROUP = X.THE_GROUP ORDER BY D.THE_VALUE) ORDER BY > C.THE_VALUE) AS THE_SECOND_VALUE_FOR_THIS_GROUP > FROM @ttt X > GROUP BY THE_GROUP; > > > Billy > >> From: Francisco H Tapia <my.lists at verizon.net> >> Reply-To: dba-sqlserver at databaseadvisors.com >> To: dba-sqlserver at databaseadvisors.com >> Subject: [dba-SQLServer] Top two of each group >> Date: Tue, 25 May 2004 12:44:15 -0700 >> >> I have a little select statement, which gives me a grouping of >> >> Model1 Frame and Week1 >> Model1 Frame and week2 >> Model1 Frame and Week3 >> Model2 Frame and Week1 >> Model2 Frame and week2 >> Model2 Frame and Week3 >> Model2 Frame and Week3 >> Model3 Frame and week2 >> Model3 Frame and Week3 >> ... etc >> >> I'm blanking out on collecting the TOP 2 of each model, instead of >> seeing the entire model list, How would one just collect the TOP two >> of each model type? >> >> I can think of how to do this in a cursor, but I'd like to avoid that >> if at all possible. >> >> -- >> -Francisco >> -- -Francisco