SQL Server中如何按OnHandX列水平排序,忽略零值从低到高排列
实现方案(覆盖常用工具场景)
方案1:Excel 365/2021及以上版本(动态数组公式,无需代码)
直接在空白单元格输入公式即可生成结果,示例适用场景:OnHand列名在B1:D1区域、对应数值在B2:D2区域,按需调整范围即可:
=TOROW(SORT(FILTER(HSTACK(B1:D1,B2:D2),B2:D2<>0),2,1),,TRUE)
公式逻辑说明:
HSTACK将列名和对应数值拼接为两列数组FILTER过滤掉数值为0的条目SORT按第二列(数值列)升序排序TOROW将排序后的数组展开为水平排列的单行
方案2:全版本Excel(VBA脚本,适合批量处理多行数据)
如果需要批量处理多行数据,或者使用低版本Excel,可使用VBA实现:
Sub SortOnhandColumnsAsc() Dim ws As Worksheet Dim rng As Range Dim arrTemp() Dim i As Long, j As Long, k As Long, m As Long, n As Long Dim temp1, temp2 ' 按需修改为实际工作表名 Set ws = ActiveSheet ' 按需修改OnHand列的范围,示例为第2列到第10列 Set rng = ws.Range(ws.Cells(1, 2), ws.Cells(ws.Rows.Count, 10)) ' 逐行处理数据 For i = 2 To rng.Rows.Count k = 0 ' 收集非0的列名和对应数值 For j = 1 To rng.Columns.Count If rng.Cells(i, j).Value <> 0 Then ReDim Preserve arrTemp(1, k) arrTemp(0, k) = rng.Cells(1, j).Value arrTemp(1, k) = rng.Cells(i, j).Value k = k + 1 End If Next j ' 按数值升序排序 For m = 0 To UBound(arrTemp, 2) - 1 For n = m + 1 To UBound(arrTemp, 2) If arrTemp(1, m) > arrTemp(1, n) Then temp1 = arrTemp(0, m): temp2 = arrTemp(1, m) arrTemp(0, m) = arrTemp(0, n): arrTemp(1, m) = arrTemp(1, n) arrTemp(0, n) = temp1: arrTemp(1, n) = temp2 End If Next n Next m ' 按需修改输出起始列,示例为从第11列开始输出结果 ws.Cells(i, 11).Resize(1, UBound(arrTemp, 2) * 2) = Application.Transpose(arrTemp) Erase arrTemp Next i End Sub
使用注意:执行前请备份原数据,避免误操作丢失内容。
方案3:Power Query场景
如果用Power Query处理数据,操作逻辑如下:
- 逆透视所有OnHand系列列
- 过滤掉值为0的行
- 按数值列升序排序
- 重新透视为水平列即可
内容的提问来源于stack exchange,提问作者Luis Colunga
相关产品推荐
相关产品推荐

