N3xtchen 的数字花园

Search

Search IconIcon to open search

使用 GPT 进行数据分析

上次更新于 Feb 24, 2023 编辑源文件

GPT 需要从我们这边获取的内容:

请求方式见:openAI api - Text Completions

下面这个是模版:

1
2
3
4
5
6
7
{数据表的内容(表结构和样本数据)}

作为一个资深的分析师,根据以上提供的表结构和数据,编写一条详细且准确的 MySQL 查询语句来解答如下分析问题:

"{问题}"

并根据你的逻辑对查询进行注解。

这里我来看一个完整的 prompt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
订单表 orders 的表结构如下:
  uuid Text comment '订单ID'
    user_id text comment '用户ID'
    store_id text comment '门店ID'
    amt double comment '订单金额'
    created_at timestamp comment '创建时间'
    time_ship_end timestamp comment '配送完成时间'

订单商品表 order_products 的表结构如下:
  uuid Text comment '主键'
    order_id Text commnet '订单ID'
    product_id Text comment '商品ID'
    units int comment '份数'
    real_price double comment '实际单价'
    created_at timestamp comment '创建时间'

商品表 products 的表结构如下:
  uuid Text comment '商品ID'
  name Text comment '商品名'
  price double comment '建议零售价'
  created_at timestamp comment '创建时间'
  

作为一个资深的分析师,根据上面给出的表结构,写出一个详细和正确的 MySQL 查询来回答下面分析问题:

"给出商品销量占比"

根据你的逻辑注释查询。

下面是 GPT 给出来的答案:

1
2
3
4
5
6
7
8
SELECT products.name, SUM(order_products.units) as total_units, 
       SUM(order_products.units * order_products.real_price) as total_sales,
       SUM(order_products.units * order_products.real_price) / 
       (SELECT SUM(units * real_price) FROM order_products) as sales_percentage
FROM order_products
JOIN products ON order_products.product_id = products.uuid
GROUP BY products.name
ORDER BY total_sales DESC

该查询首先使用 JOIN 连接 order_products 表和 products 表,通过 product_iduuid 字段建立关联,得到每个订单商品对应的商品名称。然后使用 GROUP BY 对商品名称进行分组,统计每个商品的销售数量和销售总额。接着使用一个子查询计算总销售额,并将每个商品的销售总额除以总销售额得到销售占比,别名为 sales_percentage。最后使用 ORDER BY 将结果按照销售总额降序排列,得到商品销售量占比。

# 1. 过滤

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
现在你是一个资深的分析师,有着丰富分析经验和SQL能力,请你帮个忙

Customer 的表结构如下:
  id INTEGER COMMENT "主键"
  name VARCHAR(50)
  phone VARCHAR(15)
  address VARCHAR(100)
Customer 的样本数据如下:
 id name       phone address
  1   张三 13888888888 上海市浦东新区
  2   李四 13999999999  北京市海淀区
  3   王五 13666666666  广州市天河区
  
根据以上提供的数据结构和数据,编写一个具体和准确的 mysql 的查询语句来回答如下分析问题:

"获取客户 A 的电话号码和住址"

并使用你的逻辑来注释它。

下面是 GPT 给出来的答案:

1
2
3
SELECT phone, address 
FROM Customer 
WHERE name = 'A'

该查询语句会从 Customer 表中筛选出 name 等于 ‘A’ 的记录,然后只返回这些记录中的 phone 和 address 字段,即客户 A 的电话号码和住址。

# 2. 聚合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
现在你是一个资深的分析师,有着丰富分析经验和SQL能力,请你帮个忙

Order 的表结构如下:
  id INTEGER
  order_no VARCHAR(50)
  customer_id INTEGER
  payment_id INTEGER
  shipping_address_id INTEGER
  order_status_id INTEGER
  invoice_id INTEGER
  created_at DATETIME
  updated_at DATETIME    
Order 的样本数据如下:
 id    order_no  customer_id  payment_id  shipping_address_id  order_status_id  invoice_id          created_at          updated_at
  1 20220601001            1           1                    1                2         2.0 2022-06-01 09:00:00 2022-06-02 10:00:00
  2 20220601002            2           3                    2                1         NaN 2022-06-01 14:00:00 2022-06-02 16:00:00
  3 20220602001            3           2                    3                3         1.0 2022-06-02 08:00:00                 NaT

根据以上提供的数据结构和数据,编写一个具体和准确的 mysql 的查询语句来回答如下分析问题:

"统计每个月的订单数"

并使用你的逻辑来注释它。

下面是 GPT 给出来的答案:

1
2
3
4
5
6
7
8
9
SELECT 
    DATE_FORMAT(created_at, '%Y-%m') AS month, 
    COUNT(*) AS order_count
FROM 
    Order
GROUP BY 
    month;

-- 将创建时间按年-月格式化,统计每个月的订单数,并按月份分组。

# 3. 连表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
现在你是一个资深的分析师,有着丰富分析经验和SQL能力,请你帮个忙

Customer 的表结构如下:
  id INTEGER COMMENT "主键"
  name VARCHAR(50)
  phone VARCHAR(15)
  address VARCHAR(100)    
Customer 的样本数据如下:
 id name       phone address
  1   张三 13888888888 上海市浦东新区
  2   李四 13999999999  北京市海淀区
  3   王五 13666666666  广州市天河区

Order 的表结构如下:
  id INTEGER
  order_no VARCHAR(50)
  customer_id INTEGER
  payment_id INTEGER
  shipping_address_id INTEGER
  order_status_id INTEGER
  invoice_id INTEGER
  created_at DATETIME
  updated_at DATETIME    
Order 的样本数据如下:
 id    order_no  customer_id  payment_id  shipping_address_id  order_status_id  invoice_id          created_at          updated_at
  1 20220601001            1           1                    1                2         2.0 2022-06-01 09:00:00 2022-06-02 10:00:00
  2 20220601002            2           3                    2                1         NaN 2022-06-01 14:00:00 2022-06-02 16:00:00
  3 20220602001            3           2                    3                3         1.0 2022-06-02 08:00:00                 NaT

根据以上提供的数据结构和数据,编写一个具体和准确的 mysql 的查询语句来回答如下分析问题:

"获取本月的所有订单,需要显示客户名和单号"

并使用你的逻辑来注释它。

下面是 GPT 给出来的答案:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT c.name, o.order_no
FROM Customer c
INNER JOIN Order o
ON c.id = o.customer_id
WHERE MONTH(o.created_at) = MONTH(CURRENT_DATE()) 
AND YEAR(o.created_at) = YEAR(CURRENT_DATE()); 

-- 使用内连接将 Customer 表和 Order 表连接起来
-- 在 WHERE 子句中筛选出本月的订单
-- 最后只选出客户名和单号这两个需要显示的字段

# 4. 连表聚合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
现在你是一个资深的分析师,有着丰富分析经验和SQL能力,请你帮个忙

Customer 的表结构如下:
  id INTEGER COMMENT "主键"
  name VARCHAR(50)
  phone VARCHAR(15)
  address VARCHAR(100)    
Customer 的样本数据如下:
 id name       phone address
  1   张三 13888888888 上海市浦东新区
  2   李四 13999999999  北京市海淀区
  3   王五 13666666666  广州市天河区

Order 的表结构如下:
  id INTEGER
  order_no VARCHAR(50)
  customer_id INTEGER
  payment_id INTEGER
  shipping_address_id INTEGER
  order_status_id INTEGER
  invoice_id INTEGER
  created_at DATETIME
  updated_at DATETIME    
Order 的样本数据如下:
 id    order_no  customer_id  payment_id  shipping_address_id  order_status_id  invoice_id          created_at          updated_at
  1 20220601001            1           1                    1                2         2.0 2022-06-01 09:00:00 2022-06-02 10:00:00
  2 20220601002            2           3                    2                1         NaN 2022-06-01 14:00:00 2022-06-02 16:00:00
  3 20220602001            3           2                    3                3         1.0 2022-06-02 08:00:00                 NaT

根据以上提供的数据结构和数据,编写一个具体和准确的 mysql 的查询语句来回答如下分析问题:

"统计每个月的手机号数量"

并使用你的逻辑来注释它。

下面是 GPT 给出来的答案:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
SELECT 
    DATE_FORMAT(created_at, '%Y-%m') AS `month`, -- 提取订单创建时间的月份
    COUNT(DISTINCT phone) AS phone_count -- 统计每月不同手机号的数量
FROM 
    Order o 
    JOIN Customer c ON o.customer_id = c.id -- 关联订单和顾客表
WHERE 
    c.phone IS NOT NULL -- 排除手机号为空的顾客
GROUP BY 
    `month` -- 按月份分组
ORDER BY 
    `month` ASC; -- 按月份升序排列

逻辑解析:

  1. 通过JOIN操作关联订单表和顾客表,以获取订单所属顾客的手机号码信息。
  2. 使用DATE_FORMAT()函数提取订单创建时间的月份信息。
  3. 使用COUNT()函数和DISTINCT关键字统计每个月份下不同手机号的数量。
  4. 使用WHERE子句过滤出手机号不为空的顾客。
  5. 使用GROUP BY子句按月份对数据进行分组。
  6. 使用ORDER BY子句按月份升序排列结果。