エクセル2016でパワークエリやってみる備忘録16ピボットテーブルでRANKX使用で、まとめ行に独立した順位は失敗

こちらは素人です。

エクセル2016でパワークエリ、ピボットテーブルを使います。
office2016スタンダードなので、パワーピボットタブ出ません。
(「開発」タブのCOMアドインにパワーピボットがない)

 

やったこと
RANKXを使おうと思った。(が失敗)
(たくさん失敗したので、少しだけ書きます。)

(1)下記のようなテーブルがあります(成績表)。

氏名    国語    算数    英語    クラス
山田    50    60    15    1組
川田    80    200    30    1組
島田    100    100    80    1組
田中    50    60    45    2組
島田    80    60    50    2組
松田    50    70    55    2組

 

(2)パワークエリで縦持ちデータにします。(データモデルに追加)

氏名    クラス    属性    値
山田    1組    国語    50
山田    1組    算数    60
山田    1組    英語    15
川田    1組    国語    80
川田    1組    算数    200
川田    1組    英語    30
島田    1組    国語    100
島田    1組    算数    100
島田    1組    英語    80
田中    2組    国語    50
田中    2組    算数    60
田中    2組    英語    45
島田    2組    国語    80
島田    2組    算数    60
島田    2組    英語    50
松田    2組    国語    50
松田    2組    算数    70
松田    2組    英語    55


(3)ピボットテーブルを作ります。(白紙シートからデータモデルを使用して作成)

 

(行ラベルずれてます)
行ラベル    合計 / 値    順位ALLselectedクラス    合計sumx    順位sumx
1組    715    1    715    1
山田    125    2    125    2
英語    15    18    15    18
国語    50    12    50    12
算数    60    8    60    8
川田    310    1    310    1
英語    30    17    30    17
国語    80    4    80    4
算数    200    1    200    1
島田    280    1    280    1
英語    80    4    80    4
国語    100    2    100    2
算数    100    2    100    2
2組    520    1    520    1
松田    175    2    175    2
英語    55    11    55    11
国語    50    12    50    12
算数    70    7    70    7
田中    155    2    155    2
英語    45    16    45    16
国語    50    12    50    12
算数    60    8    60    8
島田    190    2    190    2
英語    50    12    50    12
国語    80    4    80    4
算数    60    8    60    8
総計    1235    1    1235    1

 

作成したメジャー(DAX)は
「順位ALLselectedクラス」=RANKX(ALLSELECTED('クラス名前3科目'),[合計 / 値 3])
「合計sumx」=SUMX('クラス名前3科目',[合計 / 値 3])
「順位sumx」=RANKX(ALLSELECTED('クラス名前3科目'),[合計sumx])
ですが、RANKXと合計/値で作るだけでも結果は変わらないと思います。
(スライサーなどの動きが知りたくて作っただけです。適当に読み替えて下さい)
イテレータが分かっていないので使わなくていいのに使ってます)

ピボットテーブルを見てみると、各教科(最小単位)の順位になっているようです。
じゃあ、クラスや氏名で、スライサーをかけるとどうなるか・・・、結果変わりません。

 

(・・・この時点では、FilterやALLSELECTEDとかで何とかなる気がしていました。
いろいろしても変わらず。)

 

じゃあ、クラスや氏名に出ている順位は何だろうと思いました。


ヒント見つけました:
ネットで「Power BIでファイルサーバーの利用状況を確認する(Qiita)」という記事を見て、
少し違うけど、どうも各教科(最小単位)の順位に対して、科目の最高点より上なら1
位と順位付けしているようなことに気づきました。(感謝)


ならば、ピボットテーブルの行ラベルの値(クラス・氏名・科目)を使って、新たに合計列を作り、

その列でDAX(メジャー)の作成をできないかと考えました。
エクセルシートで言えば、if文で行ラベルの値(クラス・氏名・科目)を参照するとか。

 

(結果・・・失敗。ピボットテーブル(メジャー)にこだわらなければgetpivotdataやワークシート関数でできるでしょうが。)

sumxなどイテレータで、処理するにしても「行ラベル」を使ってうまく思いつかず。(初心者)


(分かってくるとできるようになるのか)

 

試行錯誤・失敗の抜粋メモ:
SUMX(FILTER('組合計 科目合計',[クラス]="2組"),[値])
これだと「2組」のクラス、氏名、科目(属性)欄が合計される。
(これだと例えば2組の行だけが出てほしい。裏に最小単位の科目の数字を持っているから)
(ちなみにフィルター関数で「組」を含む場合はどうすればいいのか?「"*組"」とかではダメでした)
(SUMX(FILTER('組合計 科目合計',RIGHT([クラス]="組",1)),[値])も途中でエラーになりました。)

 

******************************:
仕切り直し(でも結果失敗)

(1)仕方なく、元テーブルを下記のようにしました。
(実際は「組合計」を使います。)
もう面倒なので、各組の生徒には各組合計を持たせました。

(行ラベルずれてます)
氏名    国語    算数    クラス    科目合計    組合計
山田    50    60    1組    110    340
川田    80    200    2組    280    420
田中    50    60    1組    110    340
島田    80    60    2組    140    420
松田    50    70    1組    120    340

(2)パワークエリで次のように直しました。


氏名    クラス    属性    値    氏名(組合計)
山田    1組    国語    50    山田
山田    1組    算数    60    山田
山田    1組    組合計    340    組合計
川田    2組    国語    80    川田
川田    2組    算数    200    川田
川田    2組    組合計    420    組合計
田中    1組    国語    50    田中
田中    1組    算数    60    田中
田中    1組    組合計    340    組合計
島田    2組    国語    80    島田
島田    2組    算数    60    島田
島田    2組    組合計    420    組合計
松田    1組    国語    50    松田
松田    1組    算数    70    松田
松田    1組    組合計    340    組合計


氏名(組合計)には、カスタム列で作成しました。
 Table.AddColumn(ピボット解除された列, "氏名(組合計)", each if [属性]="組合計" then "組合計" else [氏名])

 

(3)ピボットテーブルにします。

(行ラベルずれてます)
行ラベル    合計 / 値
1組    1360
山田    110
国語    50
算数    60
松田    120
国語    50
算数    70
組合計    1020
組合計    1020
田中    110
国語    50
算数    60
2組    1260
川田    280
国語    80
算数    200
組合計    840
組合計    840
島田    140
国語    80
算数    60
総計    2620

組合計とか混じって変ですな。仕方ない。

 

(4)メジャー
sum(組合計除く)
=SUMX(FILTER('テーブル15',[氏名(組合計)]<>"組合計"),[値])


(行ラベルずれてます)
行ラベル    合計 / 値    sum(組合計除く)
1組    1360    340
山田    110    110
国語    50    50
算数    60    60
松田    120    120
国語    50    50
算数    70    70
組合計    1020    
組合計    1020    
田中    110    110
国語    50    50
算数    60    60
2組    1260    420
川田    280    280
国語    80    80
算数    200    200
組合計    840    
組合計    840    
島田    140    140
国語    80    80
算数    60    60
総計    2620    760


これで組合計を除いたメジャーができました。

(5)メジャー
RANKX(組合計除く)
=RANKX(ALL('テーブル15'),[sum(組合計除く)])

(行ラベルずれてます)
行ラベル    合計 / 値    sum(組合計除く)    RANKX(組合計除く)
1組    1360    340    1
山田    110    110    2
国語    50    50    8
算数    60    60    5
松田    120    120    2
国語    50    50    8
算数    70    70    4
組合計    1020        11
組合計    1020        11
田中    110    110    2
国語    50    50    8
算数    60    60    5
2組    1260    420    1
川田    280    280    1
国語    80    80    2
算数    200    200    1
組合計    840        11
組合計    840        11
島田    140    140    2
国語    80    80    2
算数    60    60    5
総計    2620    760    1


sum(組合計除く)を除くで空欄のところは11位です。0点だから最下位と判断したのか。まあOKとします。

 

(6)メジャー
sum(組合計)
SUMX(FILTER('テーブル15',[氏名(組合計)]="組合計"),[値])

(行ラベルずれてます)
行ラベル    合計 / 値    sum(組合計除く)    RANKX(組合計除く)    sum(組合計)
1組    1360    340    1    1020
山田    110    110    2    
国語    50    50    8    
算数    60    60    5    
松田    120    120    2    
国語    50    50    8    
算数    70    70    4    
組合計    1020        11    1020
組合計    1020        11    1020
田中    110    110    2    
国語    50    50    8    
算数    60    60    5    
2組    1260    420    1    840
川田    280    280    1    
国語    80    80    2    
算数    200    200    1    
組合計    840        11    840
組合計    840        11    840
島田    140    140    2    
国語    80    80    2    
算数    60    60    5    
総計    2620    760    1    1860


いい感じに空欄ができます。しかし・・・

 

(7)メジャー
RANKX(組合計)
=RANKX(ALL('テーブル15'),[sum(組合計)])

(行ラベルずれてます)
行ラベル    合計 / 値    sum(組合計除く)    RANKX(組合計除く)    sum(組合計)    RANKX(組合計)
1組    1360    340    1    1020    1
山田    110    110    2        6
国語    50    50    8        6
算数    60    60    5        6
松田    120    120    2        6
国語    50    50    8        6
算数    70    70    4        6
組合計    1020        11    1020    1
組合計    1020        11    1020    1
田中    110    110    2        6
国語    50    50    8        6
算数    60    60    5        6
2組    1260    420    1    840    1
川田    280    280    1        6
国語    80    80    2        6
算数    200    200    1        6
組合計    840        11    840    1
組合計    840        11    840    1
島田    140    140    2        6
国語    80    80    2        6
算数    60    60    5        6
総計    2620    760    1    1860    1


結果、1と6の羅列に。(失敗)
1は各科目の最高点を超えているから一律1位なのか?
6は何だろう・・・5人だからか?組合計を入れて6項目だからか?

結局、ピボットテーブル単独でRANKXで、中間のまとめ行に独立した順位を入れることは失敗しました。
他にもいろんな疑問が湧いてきた。
sumxなどでいろんな条件をいれられるように頑張ろう。