カスタマイズビュー 部門小計の出し方

お世話になっております。

 

添付のようなイメージで、カスタマイズビューを作成しようとしています。

1日毎の各店舗の売上額、昨年実績との比較、予算との比較の一覧表です。

全体集計はこちらを参考にすればできそうなのですが、

エリアごとの集計(エリア小計)の実現方法がわからず引っかかっています。

 

参考にすべきページ等があれば、ご教示頂けると幸いです。

 

何卒よろしくお願いいたします。

 

なお、この表のレイアウトを上下2つ並べ、

上を単日(1日分)の実績、

下を累計(月初~当日まで)の実績を表示したいと考えています。

 

遠藤 さん

参考になりそうなものを挙げてみます。

  1. JavaScript で集計

オブジェクトを使って、集計します。

javascript の Array.reduce() を使って JSON データを group by (sum) する

  1. 集計機能のあるグリッドライブラリを使う

探すとたくさんあると思います。

https://jp.igniteui.com/help/iggrid-overview
https://paramquery.com/pro/grid

  1. SQL が使えるなら、alasql で、rollup 集計

kintone でSQLを使う

https://github.com/agershun/alasql/wiki/Rollup

 

rex0220様

ありがとうございます。JavaScriptはあまり自信がなく、まだSQLの方が分かるので

alasqlにて対応しました。

ROLLUPで集計された行には、それぞれ上記の表と同様に、タイトルを入れるように

しました。

 

alasql(

"SELECT \
CASE WHEN a.[エリア] IS NULL THEN ‘全体’ ELSE a.[エリア] END AS [エリア], \
CASE WHEN a.[エリア] IS NULL THEN \
CASE WHEN a.[エリア] IS NULL THEN ‘全社合計’ ELSE ‘エリア小計’ END \
ELSE a.[店名] END AS [店名], \
SUM(b.[予算]) as [予算], \
SUM(b.[税抜売上額]) as [税抜売上額], \
SUM(b.[予算比]) as [予算比] \
FROM ? AS a LEFT JOIN ? as b ON a.[店名] = b.[店名] \
GROUP BY ROLLUP( a.[エリア] , a.[店名]) \
", [obj.rs1,obj.rs2]);

 

obj.rs1には、エリアや店名が登録されたマスタ、

obj.rs2には、店舗ごとの実績が入っており、

それを 店名でJOINしています。※実際にはコードを使う予定です。

 

ここで問題があり、エリア・店名には間違いなく値が入っているのですが

a.[エリア] IS NULL とすると、NULLで返ってきて、エリアのカラムの全ての

行が"全体"となってしまっています。

店名も同様で、全ての行に"全社合計"が入ってしまいます。

 

alasqlの癖でしょうか?一応、IS NULLは対応しているようなのですが・・・。

 

もしアドバイスを頂けるようでしたら、何卒よろしくお願いいたします。

 

IS NULL には、対応しているようですが、上のコードだと動きが変ですね。

回避策として、NULL 変換を分けると問題ないようです。

なお、2番目の CASE 文を少し直しています。

 

var obj = {
rs1: [
{'エリア': 'A01', '店名': 'B01'},
{'エリア': 'A01', '店名': 'B02'},
{'エリア': 'A02', '店名': 'B03'},
],
rs2: [
{'店名': 'B01', '予算': 100, '税抜売上額': 110, '予算比': 1.1 },
{'店名': 'B02', '予算': 100, '税抜売上額': 120, '予算比': 1.2 },
{'店名': 'B03', '予算': 100, '税抜売上額': 80, '予算比': 0.8 },
]
};

var rs3 = alasql(
"SELECT \
a.[エリア], \
a.[店名], \
SUM(b.[予算]) as [予算], \
SUM(b.[税抜売上額]) as [税抜売上額], \
SUM(b.[予算比]) as [予算比] \
FROM ? AS a LEFT JOIN ? as b ON a.[店名] = b.[店名] \
GROUP BY ROLLUP( a.[エリア] , a.[店名]) \
", [obj.rs1,obj.rs2]);

var rs4 = alasql(
"SELECT \
CASE WHEN [エリア] IS NULL THEN '全体' ELSE [エリア] END AS [エリア] , \
CASE WHEN [店名] IS NULL THEN \
   CASE WHEN [エリア] IS NULL THEN '全社合計' ELSE 'エリア小計' END \
ELSE [店名] END AS [店名], \
[予算], \
[税抜売上額], \
[予算比] \
FROM ? \
", [rs3]);

console.log('t3', rs4);

上記にて対応できました!誠にありがとうございました!