Google 工作表 - 计算 QUERY 函数(或任何其他函数,但不使用数据透视表 table)中的唯一/不同值
Google Sheets - Count unique / distinct values within QUERY function (or any other function, but not using pivot table)
有没有办法使用单个函数从示例 sheet 列 J:K 中获取结果?
= 有没有一种方法可以在 QUERY 函数或任何其他可以创建具有两列的类似数据透视表的数据集的单个函数中计算唯一/不同的值?
在示例中 sheet 我有一组数据,我需要将其按一列分组并计算另一列中的唯一值。那里有一个解决方法,但它涉及两个公式加上另一个可以正确排序的公式(数据集正在增长并且行被添加,因此手动排序不是最佳选择)。
Query 函数(或者,我对 Query 函数的了解)似乎无法计算唯一值,因此无法正常工作。谷歌搜索对我帮助不大。
由于数据会增长,我的想法是避免在此处使用枢轴,我需要一直更新枢轴过滤器以列出所有新位置并排除空白.希望尽可能自动化
更新:
我找到了!感谢 ahab,效果非常好。
如果两列相互跟随:
=ArrayFormula( SORT (QUERY( UNIQUE( TRIM(A:B) );
"Select Col1, count(Col2) Where Col1<>'' Group by Col1 Order by Col1
Label Col1 '', count(Col2) '' " ; 0), 2, FALSE)
如果您需要的两列之间没有需要的列:
=ArrayFormula( sort(QUERY( UNIQUE( QUERY( TRIM(C4:H) ,
"Select Col6, Col1 ") ) , "Select Col1, count(Col2) Where Col1<>''
Group by Col1 Order by Col1 Label Col1 '', count(Col2) '' " , 0), 2, FALSE))
创建数据的数据透视表 table!A3:B22,行作为 A,值作为 B。按 countunique 对值求和并按 countunique 降序对行排序。
脚本版本
function uniqueCountSort() {
var ss=SpreadsheetApp.getActiveSpreadsheet()
var s=ss.getActiveSheet()//.getSheetByName("data")
var lr=s.getLastRow()
var val=s.getRange(2, 1, lr-1, 2).getValues()
var l=val.length-1
var val=val.sort()
var newVal=[]
for(var i=l;i>0;i=i-1){
if(val[i][0]!=val[i-1][0]){
newVal.push([val[i][0],val[i][1]])}
else{
if(val[i][1]!=val[i-1][1] && val[i][1]!=null){
newVal.push([val[i][0],val[i][1]])
}}
}
var nvl= newVal.length-1
var countArray =[]
for(var i=nvl; i>0; i=i-1) {
var count = 0;
if(newVal[i][0] != newVal[i-1][0] && newVal[i-1][0]!=null){
count=1;
countArray.push([newVal[i][0],count])}
else{
count=0
for(var j=nvl; j>0; j=j-1) {
if(newVal[i][0] == newVal[j-1][0] && newVal[i][0]!=null){
count++}
}
countArray.push([newVal[i][0],count])
}
i=(i-count)+1
}
countArray.sort(mySorting)
var ret= ss.getActiveSheet().getRange(2, 3, countArray.length, 2).setValues(countArray)
}
function mySorting(a,b) {
a = a[1];
b = b[1];
return a == b ? 0 : (a < b ? 1 : -1)
}
我应该告诉你,我在使用你的示例电子表格时遇到了问题。它找不到正确的最后一行数据。我不得不删除行和列,然后再次添加它们才能使其正常工作。我找不到导致问题的原因。我在下面附上了一份 link 我测试过的你的电子表格的副本。
https://docs.google.com/spreadsheets/d/1RYfolLQGfsnY2-_-P67AYpB3KKHhT8WtR1vKUCKMtvk/edit?usp=sharing
我找到了!感谢 ahab,效果非常好。
如果两列相互跟随:
=ArrayFormula( SORT (QUERY( UNIQUE( TRIM(A:B) );
"Select Col1, count(Col2) Where Col1<>'' Group by Col1 Order by Col1
Label Col1 '', count(Col2) '' " ; 0), 2, FALSE)
如果您需要的两列之间没有需要的列:
=ArrayFormula( sort(QUERY( UNIQUE( QUERY( TRIM(C4:H) ,
"Select Col6, Col1 ") ) , "Select Col1, count(Col2) Where Col1<>''
Group by Col1 Order by Col1 Label Col1 '', count(Col2) '' " , 0), 2, FALSE))
有没有办法使用单个函数从示例 sheet 列 J:K 中获取结果?
= 有没有一种方法可以在 QUERY 函数或任何其他可以创建具有两列的类似数据透视表的数据集的单个函数中计算唯一/不同的值?
在示例中 sheet 我有一组数据,我需要将其按一列分组并计算另一列中的唯一值。那里有一个解决方法,但它涉及两个公式加上另一个可以正确排序的公式(数据集正在增长并且行被添加,因此手动排序不是最佳选择)。
Query 函数(或者,我对 Query 函数的了解)似乎无法计算唯一值,因此无法正常工作。谷歌搜索对我帮助不大。
由于数据会增长,我的想法是避免在此处使用枢轴,我需要一直更新枢轴过滤器以列出所有新位置并排除空白.希望尽可能自动化
更新:
我找到了!感谢 ahab,效果非常好。
如果两列相互跟随:
=ArrayFormula( SORT (QUERY( UNIQUE( TRIM(A:B) );
"Select Col1, count(Col2) Where Col1<>'' Group by Col1 Order by Col1
Label Col1 '', count(Col2) '' " ; 0), 2, FALSE)
如果您需要的两列之间没有需要的列:
=ArrayFormula( sort(QUERY( UNIQUE( QUERY( TRIM(C4:H) ,
"Select Col6, Col1 ") ) , "Select Col1, count(Col2) Where Col1<>''
Group by Col1 Order by Col1 Label Col1 '', count(Col2) '' " , 0), 2, FALSE))
创建数据的数据透视表 table!A3:B22,行作为 A,值作为 B。按 countunique 对值求和并按 countunique 降序对行排序。
脚本版本
function uniqueCountSort() {
var ss=SpreadsheetApp.getActiveSpreadsheet()
var s=ss.getActiveSheet()//.getSheetByName("data")
var lr=s.getLastRow()
var val=s.getRange(2, 1, lr-1, 2).getValues()
var l=val.length-1
var val=val.sort()
var newVal=[]
for(var i=l;i>0;i=i-1){
if(val[i][0]!=val[i-1][0]){
newVal.push([val[i][0],val[i][1]])}
else{
if(val[i][1]!=val[i-1][1] && val[i][1]!=null){
newVal.push([val[i][0],val[i][1]])
}}
}
var nvl= newVal.length-1
var countArray =[]
for(var i=nvl; i>0; i=i-1) {
var count = 0;
if(newVal[i][0] != newVal[i-1][0] && newVal[i-1][0]!=null){
count=1;
countArray.push([newVal[i][0],count])}
else{
count=0
for(var j=nvl; j>0; j=j-1) {
if(newVal[i][0] == newVal[j-1][0] && newVal[i][0]!=null){
count++}
}
countArray.push([newVal[i][0],count])
}
i=(i-count)+1
}
countArray.sort(mySorting)
var ret= ss.getActiveSheet().getRange(2, 3, countArray.length, 2).setValues(countArray)
}
function mySorting(a,b) {
a = a[1];
b = b[1];
return a == b ? 0 : (a < b ? 1 : -1)
}
我应该告诉你,我在使用你的示例电子表格时遇到了问题。它找不到正确的最后一行数据。我不得不删除行和列,然后再次添加它们才能使其正常工作。我找不到导致问题的原因。我在下面附上了一份 link 我测试过的你的电子表格的副本。
https://docs.google.com/spreadsheets/d/1RYfolLQGfsnY2-_-P67AYpB3KKHhT8WtR1vKUCKMtvk/edit?usp=sharing
我找到了!感谢 ahab,效果非常好。
如果两列相互跟随:
=ArrayFormula( SORT (QUERY( UNIQUE( TRIM(A:B) );
"Select Col1, count(Col2) Where Col1<>'' Group by Col1 Order by Col1
Label Col1 '', count(Col2) '' " ; 0), 2, FALSE)
如果您需要的两列之间没有需要的列:
=ArrayFormula( sort(QUERY( UNIQUE( QUERY( TRIM(C4:H) ,
"Select Col6, Col1 ") ) , "Select Col1, count(Col2) Where Col1<>''
Group by Col1 Order by Col1 Label Col1 '', count(Col2) '' " , 0), 2, FALSE))