Top/Bottom 10 Entries from Each Group/Category Excel? - vba

anybody knows how to find top/bottom 10 entries from each category? I found a partial solution for my problem from this StackExchange question , and it works great, except that it only shows the TOP values, not the BOTTOM values.
Anyone can tell me how to do the same for bottom values? I know it requires me to change some of the syntax, but I tried for hours but didn't find any.
Any help is greatly appreciated.
Thanks!

If your data is in excel's table try the following:
Create a Rank Column which will rank each value through your category
=COUNTIFS([Category],[#Category],[value],">"&[#value])+1
Create another column which calculates max value for the category, it is an array formula so, hit ctrl+shift+enter to execute it:
=MAX(IF([Category]=[#Category],[RANK]))
Create third column to decide top and bottom values based on previous 2 columns, in my example the column is either 1 or 0 to indicate relevant rows:
=IF([Category]=[#Category],IF(OR([#RANK]<=10,[#RANK]>=[#Мах]-10),1,0))
You'll end up with something like that:
Hope that helped

Related

How to add constraints with a large amount of objects in SQL query?

I want to get output from a SQL query by adding
WHERE ID IN (
15325335122,
85962128962,
12354789522,
64125335125,
64523578945,
12354784589,
......
........)
This list contains over 9000 rows, I'm wondering if there's an easy way to add them in the where statement since I don't want to copy and paste and add comma one by one. I'm new to SQL, can someone help me? Thanks in advance.
I've figured out the solution by following this instruction
In excel, select the cell next the first cell next to the first item on the right, then enter =A1&","

Conditional cell formatting on SSRS pivot table

I created a pivot table in SQL that has report names along the left side, and hours (00:00, 00:01, etc.) along the top. The values in the table are the number of times each report has been used during that hour over the past three months. I've imported the table into SSRS, and I'm trying to create a heat map of sorts. I want to color the cells darker or lighter across the row based on the number in each cell compared to the value of cells across the row (cell that has the highest value will be the darkest colored).
I've tried following this guide to color the cells, but here the entire row is one field, while I have separate fields for each column. Is there a way to achieve this?
EDIT: Added picture of table design, and preview where coloring is done incorrectly
I understand your problem better now...The function uses the min and max values of a column to determine the range from lightest to darkest, then it probably looks at what fraction of the range your actual value is. In your case where you have each column's data coming from a different cell it'll be a pain unless your columns are fixed and even then it's more trouble than it needs to be.
I would suggest the following.
DON'T PIVOT your data in SQL, we can do that really easily in SSRS, your dataset will be simpler too something like
ReportName Hour UsageCount
ReportA 0 8
ReportA 1 4
ReportC 22 18
and so on...
Create a new report and add a matrix with reportName as the row group and hour as the column group. The data values will be UsageCount.
That's it for the report design, then just set the cells back ground based on your function but this time you can pass in Max(Fields!UsageCount.Value) etc as per the sample.
I've rushed this a bit so it if not clear, let me know and I'll post a clearer solution.

Excel formula not working as expected

I have a sheet that shows max values spent anywhere. So I need to find most expensive place and return it's name. Like this:
Whole sheet.
Function.
Function in text:
=IFS((A6=MAX(D2:D31)),(INDEX(C2:C31,MATCH(A6,D2:D31,0))),(A6=MAX(H2:H31)),(INDEX(G2:G31,MATCH(A6,H2:H31,0))),(A6=MAX(K2:K31)),(INDEX(K2:K31,MATCH(A6,L2:L31,0))))
Basically I need to find a word left to value, matching A6 cell.
Thanks in advance.
Ok.. Overcomplicated!
Firstly, why the three rows? it's a lot easier if you just have one long row with all the data (tell me if you actually need 3 I'll change my solution)
=LOOKUP(MAX(D2:D31);D2:D31;C2:C31)
The MAX formula will lookup the biggest value in the list, the Lookup formula will then match it to the name.
Please note: If more than one object has the maximum price, it will only return the first one. The only way I can think of to bypass that would be to build a macro.
EDIT:
Alright.. Multi Column solution is ugly and requires extra columns that you can just hide.
As you can see you'll need 2 new columns that will find the highest for each row, 2 new columns that will find the value for each of these "highest" (in this case tree and blueberries) and then your visible answer will simply be an if statement finding out which one is bigger and giving the final verdict. This can be expanded with an infinite number of columns but increases complexity.
Here are the formulas:
MAX(H2:H31)
LOOKUP(A5;H2:H31;G2:G31)
MAX(L2:L31)
LOOKUP(C5;L2:L6;K2:K6)
IF(A5>C5;B5;D5)

Query several ranges and add automatically a column to know the source of each row

I am trying to achieve the following in Google Spreadsheets.
First, I want to query several ranges (in different sheets from the same spreadsheet). I tried a formula like this =query(arrayformula({indirect(E2:E10)}),"select * where Col1 <>''") with no success
In E2:E10 I have a list of ranges. Column F contains a name that describes the source of the value in Column E.
My second problem is that I need to add a column to the output of that query that tells me the origin of each row.
If the sources are ranges of 3 columns by country I need to merge those tables and add that country to each row.
All credits to +Ben Liebrand who helped me out here: https://support.google.com/docs/profile/3464
"I just want to start of by saying that the indirect() function does not work in an arrayformula() function as expected. So you will need to take another approach. I can understand what you are trying to do so I added another TAB in your spreadsheet to demonstrate another approach. I know it was initially a specific design you were trying so I made some changes to what you had. Maybe you can take a look at what I have offered and maybe you can tweak your design.
I know what I am offering is just very rough but you will also notice that I removed the end row specifier from your ranges in the range table.
Don't assume my example to be the final result but I was just trying to show that the range you were trying to use with the indirect() function will not work.
So hopefully this will give you a new idea of how you can maybe handle this.
My formula also adds the country to each of the tables in the output. My formula looks like this
=query(ArrayFormula({
if(len(indirect(regexextract(F2,"\w+\!\w+")&":A")),G2,),indirect(F2);
if(len(indirect(regexextract(F3,"\w+\!\w+")&":A")),G3,),indirect(F3);
if(len(indirect(regexextract(F4,"\w+\!\w+")&":A")),G4,),indirect(F4);
if(len(indirect(regexextract(F5,"\w+\!\w+")&":A")),G5,),indirect(F5);
if(len(indirect(regexextract(F6,"\w+\!\w+")&":A")),G6,),indirect(F6);
if(len(indirect(regexextract(F7,"\w+\!\w+")&":A")),G7,),indirect(F7)
})," select * where Col1 <> '' ")
Hope this is of some help to you"
And I hope is useful to the community
Gerónimo

Excel: SUMing values that fall in a range (Extending SUMIFS to use ranges of Criteria)

First post - please be gentle.
I have an interesting problem where I'm trying to convert a flat data table into a cumulative total based on two ranges (to create cumulative graphs of progress). Something that should be really easy to do.
I've managed to collate the data into a summary table (effectively a pivot table but for layout and charting purposes I cant use an actual pivot table).
(I'm too new to post images - sorry its not embedded)
Screenshot
In this screenshot I'm trying to show the 3 columns on the left as a Flat data table.
Columns A & B are text values that can be 'any' text (so I cant use wild cards).
Column C is the value I'd like to SUM.
Currently I'm using an SUMIFS statement to find the sum of the "Hours" when the "Week" label matches the values in "column A" and the "Department" label matches the value in "Column B".
I would like to change this equation to find the cumulative value for each week (so in this example cell G6 would be 14 - i.e. 4 from week 1 and 10 from week 2.)
I would like to try and avoid duplicating the entire table just to find the cumulative
All I really need to be able to do in this example is replace the equation in F5:
=SUMIFS($C$2:$C$15,$B$2:$B$15,$E5,$A$2:$A$15,F$4)
with
=SUMIFS($C$2:$C$15,$B$2:$B$15,$E5,$A$2:$A$15,$F$4:F$4)
eg Sum the hours of all the weeks that have come before. Again - i cant use wild cards and I cant use pivot tables.
I imagine I need to use some Array formulae but I cant find any online resources to help me.
Any help would be appreciated.
Your formula works in Cell F5, but in G5 just make it add F5.
F5 =SUMIFS($C:$C,$B:$B,$E5,$A:$A,F$4)
G5 =SUMIFS($C:$C,$B:$B,$E5,$A:$A,G$4)+F5
H5 =SUMIFS($C:$C,$B:$B,$E5,$A:$A,H$4)+G5
I5 =SUMIFS($C:$C,$B:$B,$E5,$A:$A,I$4)+H5
Also use the entire column reference A:A if you dont know the total number of rows.
If you cant do that you could make your read data into a table and then instead of the sum_range being some defined locations, you can use Table1[Week] = Column A instead.
Hope this helps
-Scheballs