Lesson 7 商品売上金額ベスト20帳票を作る

    Lesson6までで、バッチを用いた帳票作成の一通りの流れを学習した。Lesson7では、少し複雑な帳票を作成することによって、Mコマンドを用いた帳票作成の流れを再確認してもらいたい。ここで目的とする帳票は「1998年に関する商品売上金額ベスト20」である。1998年に購買された商品の中で何がよく売れている商品かを確認するための帳票である。
    ここで帳票のイメージを考えてもらいたい。このタイトルからイメージされる帳票は、人によって異なってくるであろうが、ここでは最終的に以下のイメージの帳票を作成することとする。
 
1998年の商品売上金額ベスト20
Lesson7にて作成
Mon Apr 13 22:44:54 JST 1998
============================
  順位   商品コード   数量      金額 
----------------------------
     1   1118706   7277  2597967
     2   1226550   4842  1697482
     3   1216511   3681  1386146 
                       :
                       :
                       :
    18    541800    127     74530
    19  1543148    133     69826
    20  1284665    114         57414 
============================

 1. 商品別売上金額データの作成

    まずはLesson6までにて得た知識で、商品別売上金額のデータを作成する。このデータがあれば、金額の多い順に並べ替え上位20行を選択し順位番号をつければ目的とする帳票が得られる。
    このバッチは以下のようになる。
 

gunzip -c /home/practice/Mine/Data/StoreMaster1/Dat/dat.gz |\
mselnum field=2 range=19980101_19981231   |\
mcut field=27,14,13                                      |\
sort                                                            |\
msum key=1 field=2,3                                   >xxtmp
    これはこれまでのレッスンの復習でもあるので問題ないであろう。xxtmpの内容を確認すれば、商品別の売上金額と数量のデータであることが確認できる。

2. ベストをとる(mbest)

    さて、次にベスト20を選択する処理を解説する。前節のxxtmpのデータに関して、もし人間が売上金額の多い上位20行を選ぶとすればどうするかを考えてもらいたい。データ件数が少なければ、売上金額をざっとみて、20行を選べばよいが、データが大量になった場合、まずそのデータが並べ替わっていれば作業がしやすいことに気がつくであろう。コンピュータでの処理も同じで、まず金額の多い順に並べ替える。その後に上位20行を選択する。並べ替えはsortコマンドを、上位を選択するためにはmbestコマンドをそれぞれ用いる。それらのコマンドを付け加えれば以下のようになる。
 

gunzip -c /home/practice/Mine/Data/StoreMaster1/Dat/dat.gz |\
mselnum field=2 range=19980101_19981231   |\
mcut field=27,14,13                                      |\
sort                                                            |\
msum key=1 field=2,3                                   |\
sort -nr +2                                                  |\
mbest key=0 best=20                                    >xxtmp
     "sort -nr +2"についてはLesson4の3節にて解説したので問題ないであろう。"mbest"コマンドは、通常であればkey=で指定した項目の値が同じ行について、best=パラメータで指定した行数だけ上位行を選択する。key=パラメータに0を指定すれば、全行同じ値と解釈される。すなわち、全行に対して、上位20行を選択することになる。さらなるmbestの利用についてはマニュアルを参照願いたい。
    バッチを実行しxxtmpの内容を確認しよう。3番目の項目(金額)の高い順で20行が選択されていることが確認できるであろう。

3. null値を含む行を削除する(mdelnul)

    前節でできあがったデータ(xxtmp)を確認すると以下のようになる。ここで売上金額第一位の商品コードを見ると"*"となっている。Mコマンドでは、null値を"*"で表現する。null値とは、あり得ない値もしくは入力されなかった値のことである。商品コードのnull値は多くの場合、POSレジで商品がスキャンされなかったことを意味する。
    ここでわからない商品を帳票に含めるかどうかは、分析する人間の判断にまかされるが、ここでは省くことにする。そこでnull値を含む行を除外するコマンド"mdelnul"を利用する。但し、このコマンドはmbestで20行抜いた後に実行すると、結果が19行となってしまうために、mbestコマンドを実行する前に実行しなければならない。そこでmdelnulコマンドを加えたバッチは以下のようになる。
 

gunzip -c /home/practice/Mine/Data/StoreMaster1/Dat/dat.gz |\
mselnum field=2 range=19980101_19981231   |\
mcut field=27,14,13                                      |\
sort                                                            |\
msum key=1 field=2,3                                   |\
mdelnul field=1                                             |\
sort -nr +2                                                  |\
mbest key=0 best=20                                    >xxtmp
mdelnulコマンドはfield=のパラメータで指定した項目にnull値が含まれていれば、その行を除外する。結果(xxtmp)を確認すれば、前節で第一位であった商品コードが"*"の行が省かれているのが確認できるであろう。
 

4. 順位をつける(mnumber)

    いよいよ最後に、第一項目に順位の連番項目をつけよう。連番をつけるコマンドはmnumberである。mnumberコマンドは、項目の最後に連番項目をつけるため、mcutコマンドによって第一項目に移さなければならない。これらを考慮したバッチはを以下に示す。
 

gunzip -c /home/practice/Mine/Data/StoreMaster1/Dat/dat.gz |\
mselnum field=2 range=19980101_19981231   |\
mcut field=27,14,13                                      |\
sort                                                            |\
msum key=1 field=2,3                                   |\
mdelnul field=1                                             |\
sort -nr +2                                                  |\
mbest key=0 best=20                                    |\
mnumber key=0                                            |\
mcut field=4,1,2,3                                         >dat7-1
mnumberコマンドのkey=0はmbestコマンドと同様に、「全ての行を対象とする」という意味で、全ての行を対象に連番を1から順につける処理をおこなう。そしてその結果くっついた連番項目(第4項目)を次の"mcut field=4,1,2,3"で先頭にもってきている。結果(dat7-1)を確認し、連番項目が作成されているかどうか確かめておこう。
 

5. 見やすい帳票にする

    それでは最後にmlist2で見やすい帳票にしよう。特に目新しいことはない。そのバッチを以下に示しておく。
 
echo '1998年の商品売上金額ベスト20'    >xxtitle
echo 'Lesson7にて作成'              >>xxtitle
date                                  >>xxtitle
echo ': 順位:商品コード: 数量: 金額:'  >xxfield

#入力ファイルの項目
#1:店コード,2:日付,3:時間,6:レシート番号,8:顧客コード
#14:数量,13:金額,27:商品コード
gunzip -c /home/practice/Mine/Data/StoreMaster1/Dat/dat.gz |\
mselnum field=2 range=19980101_19981231    |\
mcut field=27,14,13                                       |\
sort                                                             |\
msum key=1 field=2,3                                    |\
sort -nr +2                                                  |\
mbest key=0 best=20                                    |\
mnumber key=0                                            |\
mcut field=4,1,2,3                                          >dat7-1

mlist2 title=xxtitle field=xxfield <dat7-1 >dat7-2

以上の結果作成された最終帳票(dat1-7-2)は次のようになる。
 
bash $ less dat7-2
1998年の商品売上金額ベスト20
Lesson7にて作成
Tue Apr 14 00:50:52 JST 1998
================================
  順位 商品コード  数量    金額 
--------------------------------
    1    1118706   7277   2597967
    2    1226550   4842   1697482
    3    1216511   3681   1386146
    4    1287206   1141     322809
    5    1045261   1030     299832
    6    1216520     360     285710
    7    1162403   1018     235518
    8    1365312     481     197288
    9    1162390     737     183863
  10      633003     510     128868
  11    1526588     505     121710
  12    1045288     194      92458
  13    1226568     105      92400
  14      454656     255      88080
  15    1161563     302      83791
  16    1141074     254      82492
  17      687928     291     77854
  18      541800     127     74530
  19    1543148     133     69826
  20    1284665     114     57414
===============================

・演習問題

a)今回のLessonと同様な方法で「1998年に関する商品売上数量ベスト20」を作成しなさい。
b)今回のLessonと同様な方法で「1998年に関する顧客別売上数量ベスト20」を作成しなさい。
c)今回のLessonと同様な方法で「1998年に関する商品金額ワースト40」を作成しなさい。