単価と数量から各カテゴリの小計を求める。

数式1(SUM 関数)
=LET(
範囲, B2:D999,
カテ, TOCOL(INDEX(範囲,, 1), 1),
単価, TOCOL(INDEX(範囲,, 2), 1),
数量, TOCOL(INDEX(範囲,, 3), 1),
一意カテ, UNIQUE(カテ),
小計, BYROW(一意カテ, LAMBDA(x, SUM((カテ=x)*単価*数量))),
HSTACK(一意カテ, 小計)
)
数式2(SUMPRODUCT 関数)
=LET(
範囲, B2:D999,
カテ, TOCOL(INDEX(範囲,, 1), 1),
単価, TOCOL(INDEX(範囲,, 2), 1),
数量, TOCOL(INDEX(範囲,, 3), 1),
一意カテ, UNIQUE(カテ),
小計, BYROW(一意カテ, LAMBDA(x, SUMPRODUCT(N(カテ=x),単価,数量))),
HSTACK(一意カテ, 小計)
)
数式3(MMULT 関数)
=LET(
範囲, B2:D999,
カテ, TOCOL(INDEX(範囲,, 1), 1),
単価, TOCOL(INDEX(範囲,, 2), 1),
数量, TOCOL(INDEX(範囲,, 3), 1),
一意カテ, UNIQUE(カテ),
UxN, N(一意カテ=TRANSPOSE(カテ)),
NxI, 単価*数量,
小計, MMULT(UxN, NxI),
HSTACK(一意カテ, 小計)
)
MMULT 関数を使う時は、分かりやすいように行列のサイズを変数名にしている。
- U:Unique の頭文字。
- N:Number の頭文字。
- x :×(\times)の代わり。
- I :1の代わり。※ 変数名に数字は使えない。
ちなみに、小計を基準に並び替えたい場合は、SORT 関数を使う。
=LET(
範囲, B2:D999,
カテ, TOCOL(INDEX(範囲,, 1), 1),
単価, TOCOL(INDEX(範囲,, 2), 1),
数量, TOCOL(INDEX(範囲,, 3), 1),
一意カテ, UNIQUE(カテ),
小計, BYROW(一意カテ, LAMBDA(x, SUMPRODUCT(N(カテ=x),単価,数量))),
SORT(HSTACK(一意カテ, 小計), 2, -1)
)
行列に慣れているなら、最初から数式3(MMULT 関数)を利用した方が分かりやすい気がする。
Microsoft Copilot がダミーデータを生成してくれた。便利だ。