A.D.Tejpal
adtp at touchtelindia.net
Thu Feb 10 07:49:44 CST 2005
Mark,
You wish to get top 5 values per group in a totals query.
Subquery based solution, using In clause, as given in the knowledgebase article, appears to work only with normal select queries. If applied to a totals query, it fails to return any record.
Sample SQL given below, should be able to cater to your needs. It uses a subquery to rank the records in each group, as per comparative total values. This method suits both types of queries, i.e totals query (involving group by clause), as well as normal select query.
With best wishes,
A.D.Tejpal
--------------
Note - Q_Sales is the name of Totals query, fetching
TotSales (Sum of sales) grouped by Year (PYear)
and month (PMonth).
Sample SQL below, gets top 5 values of
TotSales for each year.
=================================
SELECT Q_Sales.* FROM Q_Sales
WHERE ((((Select Count(*) From Q_Sales As Q1 Where Q1.PYear = Q_Sales.PYear And (Q1.TotSales > Q_Sales.TotSales Or (Q1.TotSales = Q_Sales.TotSales And Q1.PMonth <= Q_Sales.PMonth)))) <= 5))
ORDER BY Q_Sales.PYear, Q_Sales.TotSales DESC;
=================================
----- Original Message -----
From: Admin Sparky
To: Access Developers discussion and problem solving
Sent: Thursday, February 10, 2005 00:27
Subject: Re: [AccessD] Totals Query: Top Predicate
Jim, group,
I'm having difficulties correlating M$'s subquery example...
***************
Add the following fields to the query grid:
Field: CategoryName
Sort: Ascending
Field: ProductName
Field: UnitsInStock
Sort: Descending
Criteria: In (Select Top 3 [UnitsInStock] From Products Where _
[CategoryID]=[Categories].[CategoryID] Order By [UnitsInStock] Desc)
***************
...to my original query. The goal is to return only the top 5
[Sum([qry1].Errors) AS SumOfNumberOfErrors] for each [InputYear] /
[InputMonth] combination. The below query returns all of the
necessary records, I just need to limit the results. Am I having
difficulties because I'm attempting this with a totals query?
SELECT [qry1].InputYear,
[qry1].InputMonth,
[qry1].fkChecklistItem,
Sum([qry1].Errors) AS SumOfNumberOfErrors,
[qry1].ByMonthYear,
[qry1].[CODE DESCRIPTION]
FROM [qry1]
GROUP BY [qry1].InputYear,
[qry1].InputMonth,
[qry1].fkChecklistItem,
[qry1].ByMonthYear,
[qry1].[CODE DESCRIPTION]
ORDER BY [qry1].InputYear,
[qry1].InputMonth,
Sum([qry1].NumberOfErrors) DESC;
Methinks I need a bit of hand-holding on this one:( I could achieve
this via temp tables as suggested, but I would really prefer to learn
from this.
Many TIA,
Mark
On Mon, 7 Feb 2005 14:40:16 -0500, Jim Dettman <jimdettman at earthlink.net> wrote:
> See:
>
> http://support.microsoft.com/default.aspx?scid=kb;en-us;210039
>
> Jim
>
>
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Admin Sparky
> Sent: Monday, February 07, 2005 1:47 PM
> To: accessd at databaseadvisors.com
> Subject: [AccessD] Totals Query: Top Predicate
>
> Group,
>
> I have a totals query grouped by year, then month. I would like to > return the top 5 records for each year/month combination. What are my > options? At the moment, the top predicate merely returns the top 5 records for the first year/month combination.
>
> Mark Mitsules