如何在SQL DB2-400中对多列非零值进行升序排序并后置零值?
嗨,我明白你要做的事了——把每行里大于0的数值按升序排前面,所有0都挪到后面对吧?用MIN/MAX确实搞不定,因为它们只能抓单个最值,没法批量整理整个序列。给你两个实用的方案,适配不同版本的表格工具:
方案1:适用于Excel 365/2021(支持动态数组)
直接用LET+SORT+FILTER的组合公式,一步生成整行结果:
在你想要输出结果的起始单元格(比如K2)输入:
=LET(x,A2:J2,sorted_positives,SORT(FILTER(x,x>0)),zeros,SEQUENCE(1,10-COUNTA(sorted_positives),0,0),HSTACK(sorted_positives,zeros))
公式逻辑拆解:
x,A2:J2:把当前行的10个数据赋值给变量xsorted_positives,SORT(FILTER(x,x>0)):筛选出x里大于0的数值,再按升序排序zeros,SEQUENCE(1,10-COUNTA(sorted_positives),0,0):生成需要补充的0的数量(10减去正数的个数)HSTACK(sorted_positives,zeros):把排序后的正数和0拼接成一行
输入后公式会自动填充整行10个单元格,不用手动拖动。
方案2:适用于所有Excel版本(兼容旧版)
用SMALL函数配合IFERROR做数组公式,兼容性拉满:
在输出结果的第一个单元格(比如K2)输入:
=IFERROR(SMALL($A2:$J2,ROW(A1)),0)
然后按Ctrl+Shift+Enter(旧版Excel必须按这个组合键确认数组公式,新版Excel直接回车即可),接着横向拖动这个单元格到T2(一共10个单元格)。
公式逻辑拆解:
SMALL($A2:$J2,ROW(A1)):ROW(A1)会随着横向拖动依次变成1、2…10,对应取当前行第1小、第2小…第10小的数值IFERROR(...,0):当取到第n小的数值时,如果n超过了正数的总数,SMALL会返回错误,这时候就用0填充
这样就能完美实现你要的效果:正数升序在前,0全部后置。
内容的提问来源于stack exchange,提问作者Francisco Costa




