GROUP BY句は表を集計するための構文です。
列名を指定することで、列の値が同じレコードを集計できます。
GROUP BY句の基本構文
SELECT 列名A,列名B,,,, FROM 表名 GROPU BY 列名A
AlaSQLでの記述例
let sales = [
{id:1, item_id:1, price:200, cost:50, created:'2020-6-12 10:00:00' },
{id:2, item_id:1, price:180, cost:50, created:'2020-6-12 11:00:00' },
{id:3, item_id:1, price:250, cost:60, created:'2020-6-13 10:00:00' },
{id:4, item_id:1, price:200, cost:60, created:'2020-6-13 14:00:00' },
{id:5, item_id:1, price:150, cost:60, created:'2020-6-13 18:00:00' },
{id:6, item_id:2, price:200, cost:80, created:'2020-6-13 18:00:00' },
];
let result = alasql("SELECT "
+ "item_id, "
+ "COUNT(item_id) AS price_count, "
+ "SUM(price) AS price_sum, "
+ "MAX(price) AS price_max, "
+ "MIN(price) AS price_min, "
+ "AVG(price) AS price_avg, "
+ "MEDIAN(price) as price_median "
+ " FROM "
+ " ? AS sales "
+ " GROUP BY item_id "
,[sales]);
console.log(result);
SQL部分
SELECT
item_id,
COUNT(item_id) AS price_count,
SUM(price) AS price_sum,
MAX(price) AS price_max,
MIN(price) AS price_min,
AVG(price) AS price_avg,
MEDIAN(price) as price_median
FROM
sales
GROUP BY item_id
実行結果
0: {item_id: 1, price_count: 5, price_sum: 980, price_max: 250, price_min: 150, price_avg: 196, price_median: 200}
1: {item_id: 2, price_count: 1, price_sum: 200, price_max: 200, price_min: 200, price_avg: 200, price_median: 200}
解説
今回のデータはりんごが5個、ばななが1個売れているsales表になっています。
GROUP BY item_idの記述により、リンゴの売り上げとバナナの売り上げが集計されました。
SUM(price)の部分は売り上げの合計を求めています。リンゴが980円、ばななが200円分売れていることが確認できます。
SUM()やMAX()やAVG()のような関数をSQLの世界では「集約関数」と呼びます。
今回のデータではリンゴの売り上げの平均が196円なのでバナナよりリンゴの方が販売価格はちょっと低いようですね。
なお、RDB(リレーショナルデータベース)の製品によっては「最頻値」を求めるような関数も備わっている場合もあります。
また、複数の列を元にした集約関数の実行も可能です、例えば、
SUM(price – cost) AS profit
のよな記述を行えば、粗利の合計値を求められます。