views:

71

answers:

2

Hi Guys.

I have been handed a database to run a few queries on.

For one query I have to find the top 10 applications, from two different tables with hundreds of records. then on row (11) I will need to SUM or Count the remaining records and name the row "Other".

I have worked out the following code so far.

SELECT TOP 10 ApplicationTbl.AppName, Count(*) AS SessionNos
FROM ApplicationTbl INNER JOIN SessionTbl ON ApplicationTbl.AppID = SessionTbl.AppID
GROUP BY ApplicationTbl.AppName;
ORDER BY Count(*) DESC; 

I am displayed with 10 top records, but I know need to sum the remaining SessionNos together onto row 11 and rename the AppName to "Other"

Can anyone please help, or recommend anything.

FYI: I am using Access 2007 built in SQL View, and I know that there is limits to how much can be done.

I am not very good with SQL, its new to me.

Thanks :)

+1  A: 

What you need is
1) The Query above that Gets the top 10, call it Top10Apps.
2) A second Query that selects from the same tables above, but where the rows are not in Top10Apps, and sums the rows / returns the sums & aggrigates, with the "Other" tag. Call This SumOfNotTop10Apps
3) A third query that unions Top10App & SumOfNotTop10Apps

If that's not clear post some comments and I'll try to make it clearer.

Binary Worrier
In the query that will hold the "Other" Apps don't forget to add a sub-query to filter the top 10. Below I am assuming that App name is unique.Here is the principle for a sub-querywhere appname not in (select appname from (your query above) as top10apps)
Andrew
A bit about UNION (unions)select col1, col2 from tbl1unionselect mycol1, mycol2 from sometableThat is the general layout. You can union an two or more queries as long as the number of columns in the select match and each column in the select matches on type e.g. int, char, etc
Andrew
The code above, list top 10 records which dont seem to be correct as to my code the top apps and their sessions are different and also the new column sort_col only duplicates numbers 1 and 2 on all rows and from row 11 as I wanted the record to be renamed to "Other" but its not adding all sessions for remaining applications after row 10 together.I dont mean to confuse you if I am.Please ask more questions i you need more info.Thank you and much appreciated.
Ismail
A: 
SELECT TOP 10 ApplicationTbl.AppName, Count(*) AS SessionNos
FROM ApplicationTbl 
INNER JOIN SessionTbl 
ON ApplicationTbl.AppID = SessionTbl.AppID
GROUP BY ApplicationTbl.AppName
ORDER BY Count(*) DESC

UNION ALL

SELECT "Other" AS AppName, Count(*) AS SessionNos
FROM (ApplicationTbl 
INNER JOIN SessionTbl 
ON ApplicationTbl.AppID = SessionTbl.AppID) 
LEFT JOIN (SELECT TOP 10 ApplicationTbl.AppName, Count(*) AS SessionNos
           FROM ApplicationTbl 
           INNER JOIN SessionTbl 
           ON ApplicationTbl.AppID = SessionTbl.AppID
           GROUP BY ApplicationTbl.AppName;
           ORDER BY Count(*) DESC)  AS s 
ON ApplicationTbl.AppName = s.AppName
WHERE s.AppName Is Null
GROUP BY "Other"
Remou
O man, you are legend, thanks so much, that did it.Didnt work at first as due to the semi-column ; on the following line:SELECT "Other" AS AppName, Count(*) AS SessionNos FROM (ApplicationTbl INNER JOIN SessionTbl ON ApplicationTbl.AppID = SessionTbl.AppID) LEFT JOIN (SELECT TOP 10 ApplicationTbl.AppName, Count(*) AS SessionNos FROM ApplicationTbl INNER JOIN SessionTbl ON ApplicationTbl.AppID = SessionTbl.AppID GROUP BY ApplicationTbl.AppName; <<<<<<<_-----Thanks a million.:) Exactly what I wanted
Ismail
This is the kind of thing that reports are great for. On the other hand, I once had to deliver a plain tab-delimited file to a publisher that was used to create a 50-page table, and it had to have multiple header levels. That was substantially more complicated than your two levels, and I have no recollection at all of how I actually managed it!
David-W-Fenton