一 SUM 练习
1.算出 orders 表格中的 poster_qty 纸张总订单量。
SELECT SUM(poster_qty) AS total_poster_sales FROM orders;
二 MAX MIN AVERAGEL
1.最早的订单下于何时?
SELECT MIN(occurred_at) FROM orders;
2.最近的 web_event 发生在什么时候?
SELECT MAX(occurred_at) FROM web_events;
3.算出每个订单在每种纸张上消费的平均 (AVERAGE) 金额,以及每个订单针对每种纸张购买的平均数量。最终答案应该有 6 个值,每个纸张类型平均销量对应一个值,以及平均数量对应一个值。
SELECT AVG(standard_qty) mean_standard, AVG(gloss_qty) mean_gloss, AVG(poster_qty) mean_poster, AVG(standard_amt_usd) mean_standard_usd, AVG(gloss_amt_usd) mean_gloss_usd, AVG(poster_amt_usd) mean_poster_usd FROM orders;
三 GROUP BY
1.算出每个客户的总销售额(单位是美元)。答案应该包括两列:每个公司的订单总销售额(单位是美元)以及公司名称。
SELECT a.name, SUM(total_amt_usd) total_sales FROM orders o JOIN accounts a ON a.id = o.account_id GROUP BY a.name;
2.算出 web_events 中每种渠道的次数。
SELECT w.channel, COUNT(*) FROM web_events w JOIN accounts a ON a.id = w.account_id GROUP BY w.channel
3.算出每个区域的销售代表人数。最终表格应该包含两列:区域和 sales_reps 数量。从最少到最多的代表人数排序。
SELECT r.name, COUNT(*) num_reps FROM region r JOIN sales_reps s ON r.id = s.region_id GROUP BY r.name ORDER BY num_reps;
4.确定在 web_events 表格中针对每个地区特定渠道的使用次数。最终表格应该有三列:区域名称、渠道和发生次数。按照最高的发生次数在最上面对表格排序。
SELECT r.name, w.channel, COUNT(*) num_events FROM accounts a JOIN web_events w ON a.id = w.account_id JOIN sales_reps s ON s.id = a.sales_rep_id JOIN region r ON r.id = s.region_id GROUP BY r.name, w.channel ORDER BY num_events DESC;
四 HAVING
1.有多少个客户具有超过 20 个订单?
SELECT a.id, a.name, COUNT(*) num_orders FROM accounts a JOIN orders o ON a.id = o.account_id GROUP BY a.id, a.name HAVING COUNT(*) > 20 ORDER BY num_orders;
2.有多少个客户在所有订单上消费的总额不到 1,000 美元?
SELECT a.id, a.name, SUM(o.total_amt_usd) total_spent FROM accounts a JOIN orders o ON a.id = o.account_id GROUP BY a.id, a.name HAVING SUM(o.total_amt_usd) < 1000 ORDER BY total_spent;
四 DATE
1.Parch & Posey 在哪一年的总销售额最高?数据集中的所有年份保持均匀分布吗?
SELECT DATE_PART('year', occurred_at) ord_year, SUM(total_amt_usd) total_spent FROM orders GROUP BY 1 ORDER BY 2 DESC;
五 CASE
1.我们想要根据相关的购买量了解三组不同的客户。最高的一组是终身价值(所有订单的总销售额)大于 200,000
美元的客户。第二组是在 200,000 到 100,000
美元之间的客户。最低的一组是低于 under 100,000
美元的客户。请提供一个表格,其中包含与每个客户相关的级别。你应该提供客户的名称、所有订单的总销售额和级别。消费最高的客户列在最上面。
SELECT a.name, SUM(total_amt_usd) total_spent, CASE WHEN SUM(total_amt_usd) > 200000 THEN 'top' WHEN SUM(total_amt_usd) > 100000 THEN 'middle' ELSE 'low' END AS customer_level FROM orders o JOIN accounts a ON o.account_id = a.id GROUP BY a.name ORDER BY 2 DESC;
2.现在我们想要执行和第一个问题相似的计算过程,但是我们想要获取在 2016
年和 2017
年客户的总消费数额。级别和上一个问题保持一样。消费最高的客户列在最上面。
SELECT a.name, SUM(total_amt_usd) total_spent, CASE WHEN SUM(total_amt_usd) > 200000 THEN 'top' WHEN SUM(total_amt_usd) > 100000 THEN 'middle' ELSE 'low' END AS customer_level FROM orders o JOIN accounts a ON o.account_id = a.id WHERE occurred_at > '2015-12-31' GROUP BY 1 ORDER BY 2 DESC;
3.我们想要找出绩效最高的销售代表,也就是有超过 200 个订单的销售代表。创建一个包含以下列的表格:销售代表名称、订单总量和标为 top
或 not
的列(取决于是否拥有超过 200 个订单)。销售量最高的销售代表列在最上面。
SELECT s.name, COUNT(*) num_ords, CASE WHEN COUNT(*) > 200 THEN 'top' ELSE 'not' END AS sales_rep_level FROM orders o JOIN accounts a ON o.account_id = a.id JOIN sales_reps s ON s.id = a.sales_rep_id GROUP BY s.name ORDER BY 2 DESC;