こちらは素人です。
エクセル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などでいろんな条件をいれられるように頑張ろう。