Arrayformula - Gather all text from rows with same key id - google-sheets

I am trying to create an arrayformula that will look at a "key id" column and gather all text from another column from all rows with the same "key id":
-- col A / col B / col C
1- KEY ID / NOTE / COMPILED NOTES
2- A1BZ / TACO / TACO FROG
3- T212 / CORN / CORN APPLE
4- T212 / APPLE / CORN APPLE
5- CD41 / DOG / DOG
6- A1BZ / FROG / TACO FROG
I am using it with appsheet as a back end formula and as the sheet is active (having rows removed and added I need this to be an arrayformula. I thought some type of JOIN() with an IF statement. But I've note come up with anything that works. I can make it work if it's not an array formula with a FILTER().
Thoughts?

See my comment and questions above. However, if the answer to my parenthetical question there is YES, you can delete everything in Col-C (including the header) and place the following formula in cell C1:
=ArrayFormula({"COMPILED NOTES"; IF(A2:A="",,VLOOKUP(A2:A,TRIM(SPLIT(FLATTEN(QUERY(QUERY({A2:A&"~",B2:B},"Select MAX(Col2) WHERE Col2 Is Not Null GROUP BY Col2 PIVOT Col1"),,9^9)),"~")),2,FALSE))})

Related

Trouble with a single cell formula being converted to a full column formula

I have a Google Sheet that has a Google Form populating the results of many games that a friend and I play. I have created a new column and added a formula to the top cell in that column and just copied it down the column:
=JOIN(" / ",(FILTER(MyDecks!B$2:B,MyDecks!A$2:A=B5)),(FILTER(HisDecks!B$2:B,HisDecks!A$2:A=C5)))
MyDecks column A is a list of deck names.
MyDecks column B is an attribute of each deck, which is the desired return value.
B5 and C5 are both within columns of the Sheet tab where the formula exists.
The output when using the formula above is something like "M / P", for example.
This formula however, currently has to be copied and pasted, or just extended down to the new cells any time I add another entry with the Google Form.
I would like this formula to be altered so that it will function the same as it does currently, but have it reside within the column head itself so that new entries will just accept and render the formula automatically for the new entries that I create.
I have tried:
=ArrayFormula(IF(ROW(D:D)=4,"Matchup",IF(ISBLANK(C:C),"",JOIN(" / ",(FILTER(MyDecks!B$2:B,MyDecks!A$2:A=B$5:B)),(FILTER(HisDecks!B$2:B,HisDecks!A$2:A=C$5:C))))))
and many other iterations of the same idea, to no avail. I am a novice and am hoping that there is an easy solution to my issue.
use:
={"Matchup"; ARRAYFORMULA(IFNA(
VLOOKUP(B5:B, JoeDecks!A2:B, 2, 0)&" / "&
VLOOKUP(C5:C, BryanDecks!A2:B, 2, 0)))}

Pivoting programatically and carrying color information in summary of Google sheets

We have a base table that looks like this, in our main sheet called "MainData".
We would like to summarize it in a new worksheet. The summary needs to be by time, in a program management mode, where the "When" becomes the main view, in the following way. We could technically get a version of the top part of the table via Pivot, but that forces a new worksheet. We would like this entire view to be in our own second sheet of choice which we can call "Summary".
Not sure where to begin with this. The GETPIVOTDATA command seems a more convenient way to control how the pivot shows without forcing a worksheet, but it's the itemization of colours etc that is confusing. In each week's listing below that week column, we'd like to show the items but their cell needs to be coloured by the Status that item is in.
Not looking for ready made solutions (although I won't revolt if that's shared), just looking for pointers for which functions to look for. Thanks muchly!
Solution:
It's quite a task... :)
I have build working solution for you.
Go to this link to grab this (2 sheets - data and report)
Explanation:
Data sheet:
I added an extra column to source data - we will need this column in further query (you can hide this column)
={"Rep Desc";ArrayFormula(if(A2:A<>"";"Count of "&A2:A;))}
Report sheet:
I added 2 extra columns (A:B) (you can hide them later) to explain better what is going on. There are 4 main parts to this solution - you are able to pack all of them into one formula, but for sake of clarification I left them separate.
Part 1 Numbers of "Open / Closes / Attn"
This is simple query - we use extra column in data source to have desire description (Count of... instead just Attn, Closed, etc)
=QUERY({INDIRECT($A$1)};$B$1;1)
string to query
select Col5, count(Col4) where Col1 is not null group by Col5 pivot Col3 label Col5 ''
Part 2 - "Sum of Point"
Its Query again put into next query to remove headers + "Sum of Points" as an extra column (using inline array - {}):
={"Sum of Points"\QUERY(QUERY({INDIRECT($A$1)};B5;1);"select * offset 1";0)}
string to query
select sum(Col4) where Col1 is not null pivot Col3
Part 3 - "Features"
It is quite complicated... If I find more time I will describe what is going on here... but for now just code:
=QUERY(
transpose(ArrayFormula(SPLIT(
transpose(SPLIT(
TEXTJOIN("^";1;transpose(
{SPLIT(join(" ## ";transpose(query(transpose(QUERY({INDIRECT($A$1)};$B$9;1));"select Col1 offset 1";0)));" #";0;1);
QUERY(ArrayFormula(IF(TRANSPOSE(query(transpose(QUERY({INDIRECT($A$1)};$B$9;1));"select * offset 1";0))<>"";
query(QUERY({INDIRECT($A$1)};$B$9;1);"select Col1";0);""));"select * offset 1";0)}
))
;"# ";0;1))
;"^")))
;
"select * offset 1";0)
Part 4 - Conditional formatting
For range D9:H apply 3 rules with corresponding color :
=INDEX(INDIRECT("data!$A:$A");MATCH(D9;INDIRECT("data!$B:$B");0);1)="Open"
=INDEX(INDIRECT("data!$A:$A");MATCH(D9;INDIRECT("data!$B:$B");0);1)="Closed"
=INDEX(INDIRECT("data!$A:$A");MATCH(D9;INDIRECT("data!$B:$B");0);1)="Attn"
OK?
Is that what you were going to achieve?
Again - this is working copy for you:
Go to this link to grab this (2 sheets - data and report)

Output a normalized column with a calculated field in QUERY

In Google Spreadsheet, I have the expression:
=QUERY(database; "select b,c, where a='anyone-condition' order by c desc";-1)
The column a,b are strings and c is a number.
How can I include in this query one calculated field, c/sum(c)?
Although Ed Nelson is perfectly right, you can be creative with multiple nested Queries and get desire result without an extra column.
I have build simple example that will show you the way
Data
Solution 1 - simpler but with ugly column name
=QUERY(
A1:C3,"select A,B,C/"&QUERY(
QUERY(A1:C3,"select sum(C)"),"select * offset 1",0)&"" ,1
)
Solution 1.1 - more complex but with custom column name
=QUERY(
A1:C3,"select A,B,C/"&QUERY(
QUERY(A1:C3,"select sum(C)"),"select * offset 1",0)&
" label C/"&QUERY(
QUERY(A1:C3,"select sum(C)"),"select * offset 1",0)&
" 'C/sum'",1
)
Finals:
You can go further and add formating to last column as well
Link to working copy
For your specific example probably code should be like this:
=query(database; "select b,"&query(query(database; "select sum(c), where a='anyone-condition' "),"select * offset 1",0)&" where a='anyone-condition' order by c desc";-1)
But, it should be tested against real data
Is that serves your needs?
You can't do a sum without doing a group which you don't want. You can add a column D to your sheet to sum. Try =sum($C$2:$C) in D and copy down. Then this will work:
=query(database, "select B,C/D where A='anyone-condition' order by C desc label C/D ''",-1)
The problem is with the Google Spreadsheet 'kernel', not with my coding. Look the scream that I printed
https://drive.google.com/file/d/1yJbcfVZ1tDmW8WoG224PALRIwyEbX9LH/view?usp=sharing

Data reduction via IMPORTRANGE

I am trying to do some data reduction in my Google Sheets by using the following IMPORTRANGE formula:
=query(importrange("https://docs.google.com/a/ap.averydennison.com/spreadsheets/d/1xz1lXY-w5Ii_aWqVAhHgRCmeoes9ltSUtibE4kzhMHA/edit#gid=2051232966","SF_Flex_Rel!a:l"),
"select * where Col1 = '"&text(B1,"###")&"'",1)
The 'source' sheet has a whole lot of sales data records. What I am trying to do in the new sheet via this formula is only bring in the sales records from the source sheet that match the customer number specified in cell B1.
It seems to work OK if I limit the IMPORTRANGE to only query about 10,000 rows. Once I go over around 20,000 rows the screen will briefly flash up the records, then a small progress bar shows in the top right corner of the sheet and the records disappear. The cell with the formula just shows #ERROR! with no other comments to tell me why.
Is there something wrong with my formula syntax?
Is there a better way to achieve this data reduction?
Is there some undocumented data limitation on IMPORTRANGE function (I am using 'new' Google Sheets)?
try like my example :
=QUERY( // data
IMPORTRANGE(
"Spreadsheet Key", // spreadsheet key
"DATA!A:C" // datarange
),
"SELECT Col1 WHERE Col2=" & "'" & B2 & "'" // query
)
I had the same problem. This answer helped me find a workaround : https://productforums.google.com/forum/#!topic/docs/RxVUFGWQ2Y4
In my example :
1) In the spreadsheet where the data is I have added a few empty columns (E to H) in order to display 4 columns of data in 5 maximum rows.
=Query(Sheet1!A:D,"select * Where A contains 'KEYWORD' limit 5",1)
2) Then in the other spreadsheet:
=ImportRange("https://docs.google.com/spreadsheets/d/ss_key_here/", "'Sheet1'!E1:H5")

Combine multiple Query select and where conditions google spreadsheets

Not sure how to title this one... So please forgive me.
What we have is a POS sheet, I import POS data from Distributors then given the zipcode value it sorts the info and populates other sheets within the doc for each person responsible for the sale.
Sheet2 is the main POS sheet where all the data is imported into.
Rep Template is the sheet for any given rep responsible for the sale.
The Rep Template contains again a list similar to Sheet2 but only sales that apply to them (thanks to the zip code formula Im using). I However have on problem in this Rep Template. Im using a QUERY eg
=query(index(A19:F); "select (month(Col1)+1),sum(Col4), (sum(Col4)*.05) where Col1 is not null group by (month(Col1)+1) label (month(Col1)+1) 'MONTH',sum(Col4) 'TOTAL SALES',(sum(Col4)*.05) 'COMMISSION EARNINGS' ")
***See the highlighted yellow section #L9
This works fine
Q.What I would like to do is add this to it
but I cannot use (sum(D)*.05) again for another column...
=query(A19:F, "select (sum(D)*.05) where F != 'N' group by (month(A)+1) label (sum(D)*.05) 'ADJUSTED COMMISSION EARNINGS' ")
***see the highlighted orange section #N3
(Also why is this skipping down one cell that could solve a lot)
The thing is some commission for reasons xyz may be omitted once verified (hence F19:F) an "N" in COLUMN F will omit that line from the commissions resulting in adjusted commissions earnings.
Here is my Spreadsheet
https://docs.google.com/spreadsheet/ccc?key=0AqZjzFwBse-sdGZ4M3ppWVBuNTdJV3dYbGlwb0NUeVE&usp=sharing
Thanks everyone ; )
Please change Col1=A and Col4=D, it is right
use double-query:
=QUERY(QUERY(A19:F,
"select sum(D)
where F != 'N'
group by month(A)+1
label sum(D)''", ),
"select Col1*.05
label Col1*.05'ADJUSTED COMMISSION EARNINGS'")

Resources