mfy学习笔记

创建表并导入数据

sql 复制代码
CREATE TABLE sales (
    id INT,
    salesperson STRING,
    region STRING,
    sales_amount INT,
    sale_date DATE
);

INSERT INTO sales (id, salesperson, region, sales_amount, sale_date)
VALUES
(1, 'Alice', 'North', 1000, '2023-01-01'),
(2, 'Bob', 'South', 1500, '2023-01-02'),
(3, 'Alice', 'North', 2000, '2023-01-03'),
(4, 'Charlie', 'East', 1200, '2023-01-04'),
(5, 'Bob', 'South', 1800, '2023-01-05'),
(6, 'Alice', 'North', 2500, '2023-01-06'),
(7, 'Charlie', 'East', 1300, '2023-01-07'),
(8, 'Bob', 'South', 2200, '2023-01-08'),
(9, 'Alice', 'North', 3000, '2023-01-09'),
(10, 'Charlie', 'East', 1400, '2023-01-10');

示例数据表:sales

id salesperson region sales_amount sale_date
1 Alice North 1000 2023-01-01
2 Bob South 1500 2023-01-02
3 Alice North 2000 2023-01-03
4 Charlie East 1200 2023-01-04
5 Bob South 1800 2023-01-05
6 Alice North 2500 2023-01-06
7 Charlie East 1300 2023-01-07
8 Bob South 2200 2023-01-08
9 Alice North 3000 2023-01-09
10 Charlie East 1400 2023-01-10
sql 复制代码
---

### 1. `CASE WHEN` 示例
根据销售额给销售人员分类:

```sql
SELECT 
    salesperson,
    sales_amount,
    CASE 
        WHEN sales_amount < 1500 THEN 'Low'
        WHEN sales_amount BETWEEN 1500 AND 2500 THEN 'Medium'
        ELSE 'High'
    END AS sales_category
FROM 
    sales;
运行结果:
salesperson sales_amount sales_category
Alice 1000 Low
Bob 1500 Medium
Alice 2000 Medium
Charlie 1200 Low
Bob 1800 Medium
Alice 2500 Medium
Charlie 1300 Low
Bob 2200 Medium
Alice 3000 High
Charlie 1400 Low

2. SUM(CASE WHEN) 示例

计算每个区域的销售总额:

sql 复制代码
SELECT 
    region,
    SUM(CASE WHEN salesperson = 'Alice' THEN sales_amount ELSE 0 END) AS alice_sales,
    SUM(CASE WHEN salesperson = 'Bob' THEN sales_amount ELSE 0 END) AS bob_sales,
    SUM(CASE WHEN salesperson = 'Charlie' THEN sales_amount ELSE 0 END) AS charlie_sales
FROM 
    sales
GROUP BY 
    region;
运行结果:
region alice_sales bob_sales charlie_sales
North 8500 0 0
South 0 5500 0
East 0 0 3900

3. RANK() 示例

根据销售额对销售人员进行排名:

sql 复制代码
SELECT 
    salesperson,
    sales_amount,
    RANK() OVER (ORDER BY sales_amount DESC) AS sales_rank
FROM 
    sales;
运行结果:
salesperson sales_amount sales_rank
Alice 3000 1
Bob 2200 2
Alice 2500 3
Bob 1800 4
Alice 2000 5
Bob 1500 6
Charlie 1400 7
Charlie 1300 8
Alice 1000 9
Charlie 1200 10

4. ROW_NUMBER() 示例

为每个销售人员的销售额分配一个唯一的行号:

sql 复制代码
SELECT 
    salesperson,
    sales_amount,
    ROW_NUMBER() OVER (PARTITION BY salesperson ORDER BY sales_amount DESC) AS row_num
FROM 
    sales;
运行结果:
salesperson sales_amount row_num
Alice 3000 1
Alice 2500 2
Alice 2000 3
Alice 1000 4
Bob 2200 1
Bob 1800 2
Bob 1500 3
Charlie 1400 1
Charlie 1300 2
Charlie 1200 3

5. DENSE_RANK() 示例

根据销售额对销售人员进行密集排名(不会跳过排名):

sql 复制代码
SELECT 
    salesperson,
    sales_amount,
    DENSE_RANK() OVER (ORDER BY sales_amount DESC) AS dense_rank
FROM 
    sales;
运行结果:
salesperson sales_amount dense_rank
Alice 3000 1
Bob 2200 2
Alice 2500 3
Bob 1800 4
Alice 2000 5
Bob 1500 6
Charlie 1400 7
Charlie 1300 8
Alice 1000 9
Charlie 1200 10

总结

  • CASE WHEN:用于条件判断,生成新的列。
  • SUM(CASE WHEN):用于按条件汇总数据。
  • RANK():用于排名,允许并列排名并跳过后续名次。
  • ROW_NUMBER():用于生成唯一的行号,即使数据相同也会分配不同行号。
  • DENSE_RANK():用于密集排名,允许并列排名但不跳过后续名次。

通过这些示例和运行结果,可以清晰地展示每个函数的作用和用法!

相关推荐
程序猿乐锅1 小时前
【Tilas|第三篇】多表SQL语句
数据库·经验分享·笔记·学习·mysql
徐某人..1 小时前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
AOwhisky1 小时前
Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础
linux·运维·笔记·学习·云原生·kubernetes
光影少年2 小时前
大屏页面,一次多个请求,请求加密导致 点击 全局时间选择器 时出现卡顿咋解决(面板收起会延迟1~2秒)
前端·javascript·vue.js·学习·前端框架·echarts·reactjs
sakiko_3 小时前
UIKit学习笔记2-组件嵌套、滚动视图等
笔记·学习·objective-c·swift·uikit
知识分享小能手3 小时前
R语言入门学习教程,从入门到精通,R语言类别比较数据可视化- 完整知识点与案例代码(4)
学习·信息可视化·r语言
蛋白界小百灵3 小时前
纳米抗体技术全解析:从文库构建到亲和力成熟的关键策略
经验分享·科技·学习·健康医疗·业界资讯·卡梅德生物
我是发哥哈4 小时前
主流AI框架生产环境性能对比:5大关键维度深度评测
大数据·人工智能·学习·机器学习·ai·chatgpt·ai-native
nashane4 小时前
HarmonyOS 6学习:RCP远场通信流式返回实战——告别“一次性”数据阻塞
学习·华为·harmonyos
for_ever_love__4 小时前
UI学习:UITableView的基本操作及折叠cell
学习·ui·ios