
企业微信

飞书
选择您喜欢的方式加入群聊

扫码添加咨询专家
大多数企业都面临这样的困境:数据存在数据库里,但业务人员查不到;技术人员能查,但忙不过来。传统 BI 工具学习成本高、部署复杂,往往买了就闲置。
本文将手把手教你用 AskTable 在 1 小时内搭建企业级 AI 数据分析系统,让业务人员用自然语言直接查询数据,无需学习 SQL,无需依赖技术团队。
完成本教程后,你将实现:
✅ 连接企业数据库(MySQL/PostgreSQL/SQL Server 等) ✅ 配置业务语义层,让 AI 理解业务术语 ✅ 用自然语言查询数据,如"本月销售额前 10 的产品" ✅ 设置权限控制,确保数据安全 ✅ 创建可复用的数据分析模板
所需时间:60 分钟 技术要求:无需编程基础,会用 Excel 即可 适用场景:中小企业、创业团队、部门级数据分析
访问 AskTable 官网,点击"免费试用",注册账号。
选择部署方式:
本教程以云端 SaaS 为例。
你需要准备以下信息(以 MySQL 为例):
db.example.com:3306sales_dbreadonly_user安全建议:
没有现成数据? 可以用我们提供的示例数据库:
demo.asktable.com:3306ecommerce_demodemo_userdemo2026登录 AskTable 后,进入"数据源"页面:
连接名称: 销售数据库
主机地址: db.example.com
端口: 3306
数据库名: sales_db
用户名: readonly_user
密码: ********
常见问题:
Q: 连接失败,提示"无法连接到数据库" A: 检查以下几点:
Q: 我的数据库在内网,无法从外网访问 A: 有两种解决方案:
连接成功后,AskTable 会自动读取数据库中的所有表:
orders、products、customers)提示:
点击某个表(如 orders),查看表结构:
表名: orders(订单表)
字段:
- order_id (int): 订单 ID
- user_id (int): 用户 ID
- product_id (int): 产品 ID
- amount (decimal): 订单金额
- status (varchar): 订单状态
- created_at (datetime): 创建时间
- paid_at (datetime): 支付时间
表关系: AskTable 会自动识别外键关系,如:
orders.user_id → customers.user_idorders.product_id → products.product_id如果自动识别不准确,可以手动配置表关系。
业务语义层是让 AI 理解业务语言的关键。我们需要告诉 AI:
进入"语义层"页面,点击"添加指标":
示例 1:销售额(GMV)
指标名称: 销售额
英文名称: GMV
描述: 已支付订单的总金额
计算方式: 聚合
聚合函数: SUM
字段: orders.amount
过滤条件:
- orders.status IN ('paid', 'completed')
单位: 元
同义词:
- 营收
- 交易额
- 成交总额
示例 2:订单量
指标名称: 订单量
英文名称: Order Count
描述: 订单总数
计算方式: 计数
聚合函数: COUNT
字段: orders.order_id
过滤条件:
- orders.status != 'cancelled'
同义词:
- 订单数
- 成交单数
示例 3:客单价
指标名称: 客单价
英文名称: AOV (Average Order Value)
描述: 平均每个订单的金额
计算方式: 自定义
SQL 表达式: SUM(amount) / COUNT(DISTINCT order_id)
数据表: orders
过滤条件:
- orders.status IN ('paid', 'completed')
单位: 元
同义词:
- 平均订单金额
- 单均价
示例 4:月活跃用户数(复杂指标)
指标名称: 月活跃用户数
英文名称: MAU
描述: 过去 30 天内至少有一次登录或购买行为的去重用户数
计算方式: 自定义 SQL
SQL 定义: |
SELECT COUNT(DISTINCT user_id) as mau
FROM (
SELECT user_id, login_time as action_time
FROM user_login_logs
WHERE login_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)
UNION
SELECT user_id, created_at as action_time
FROM orders
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
) AS active_users
同义词:
- 月活
- MAU
维度是数据分析的视角,用于分组和筛选。
示例 1:时间维度
维度名称: 订单日期
字段: orders.created_at
类型: 日期时间
支持的粒度:
- 日: DATE(created_at)
- 周: YEARWEEK(created_at)
- 月: DATE_FORMAT(created_at, '%Y-%m')
- 年: YEAR(created_at)
预定义时间段:
- 今天: created_at >= CURDATE()
- 昨天: DATE(created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
- 本周: created_at >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
- 本月: created_at >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
- 上月: created_at >= DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 1 MONTH)
AND created_at < DATE_FORMAT(CURDATE(), '%Y-%m-01')
示例 2:产品分类维度
维度名称: 产品分类
字段: products.category
类型: 文本
层级:
- 一级分类: category_level1
- 二级分类: category_level2
可选值:
- 电子产品
- 服装
- 食品
- 图书
示例 3:用户地域维度
维度名称: 用户地域
字段: customers.region
类型: 文本
层级:
- 大区: region_level1(华东、华北、华南等)
- 省份: region_level2(北京、上海、广东等)
- 城市: region_level3(北京市、上海市、广州市等)
业务规则封装了复杂的业务逻辑。
示例:有效订单规则
规则名称: 有效订单
描述: 满足以下条件的订单才算有效
条件:
- status IN ('paid', 'completed', 'shipped')
- amount > 0
- user_id > 10000 # 排除测试用户
- created_at >= '2024-01-01' # 只统计 2024 年后的数据
SQL 片段: |
WHERE status IN ('paid', 'completed', 'shipped')
AND amount > 0
AND user_id > 10000
AND created_at >= '2024-01-01'
应用场景: 所有涉及订单统计的指标都自动应用这个规则,确保口径一致。
配置完成后,测试一下:
提问:"本月销售额是多少?"
AI 理解:
created_at >= DATE_FORMAT(CURDATE(), '%Y-%m-01')SUM(amount),并自动应用"有效订单"规则生成 SQL:
SELECT SUM(amount) as gmv
FROM orders
WHERE status IN ('paid', 'completed', 'shipped')
AND amount > 0
AND user_id > 10000
AND created_at >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
返回结果:
本月销售额: ¥1,234,567
配置好语义层后,就可以开始用自然语言查询数据了。
问题 1:"昨天的订单量是多少?"
AI 生成:
SELECT COUNT(*) as order_count
FROM orders
WHERE DATE(created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
AND status != 'cancelled'
问题 2:"本周每天的销售额"
AI 生成:
SELECT
DATE(created_at) as date,
SUM(amount) as gmv
FROM orders
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
AND status IN ('paid', 'completed')
GROUP BY DATE(created_at)
ORDER BY date
返回结果:自动生成折线图,展示趋势。
问题 3:"对比本月和上月的销售额"
AI 生成:
SELECT
CASE
WHEN created_at >= DATE_FORMAT(CURDATE(), '%Y-%m-01') THEN '本月'
ELSE '上月'
END as period,
SUM(amount) as gmv
FROM orders
WHERE created_at >= DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 1 MONTH)
AND status IN ('paid', 'completed')
GROUP BY period
返回结果:
本月: ¥1,234,567
上月: ¥1,100,000
增长率: +12.2%
问题 4:"各产品分类的销售额占比"
AI 生成:
SELECT
p.category,
SUM(o.amount) as gmv,
SUM(o.amount) / (SELECT SUM(amount) FROM orders WHERE status IN ('paid', 'completed')) * 100 as percentage
FROM orders o
JOIN products p ON o.product_id = p.product_id
WHERE o.status IN ('paid', 'completed')
GROUP BY p.category
ORDER BY gmv DESC
返回结果:自动生成饼图,展示各分类占比。
问题 5:"销售额最高的 10 个产品"
AI 生成:
SELECT
p.product_name,
SUM(o.amount) as gmv
FROM orders o
JOIN products p ON o.product_id = p.product_id
WHERE o.status IN ('paid', 'completed')
GROUP BY p.product_id, p.product_name
ORDER BY gmv DESC
LIMIT 10
第 1 轮:"本月各地区的销售额" 返回:华东 ¥500K,华北 ¥400K,华南 ¥300K...
第 2 轮:"只看华东的"
AI 理解:延续上一轮查询,添加过滤条件 region = '华东'
第 3 轮:"按城市分组" AI 理解:在华东地区的基础上,按城市分组
这种多轮对话能力让数据探索更加流畅。
数据安全至关重要,尤其是涉及客户信息、财务数据时。
进入"权限管理"页面,创建不同角色:
角色 1:销售人员
角色名称: 销售人员
权限范围:
可访问数据源: 销售数据库
可访问表:
- orders(只能看自己区域的订单)
- customers(只能看自己区域的客户)
- products(全部可见)
行级权限:
- orders: region = :user_region
- customers: region = :user_region
列级权限:
- customers.phone: 脱敏显示(138****5678)
- customers.id_card: 不可见
角色 2:运营人员
角色名称: 运营人员
权限范围:
可访问数据源: 销售数据库
可访问表: 全部可见
行级权限: 无限制
列级权限:
- customers.phone: 脱敏显示
- customers.id_card: 脱敏显示
禁止操作:
- 批量导出客户数据(单次导出不超过 100 条)
角色 3:管理层
角色名称: 管理层
权限范围: 全部权限
行级权限: 无限制
列级权限: 全部可见
允许操作: 全部
姓名: 张三
邮箱: zhangsan@company.com
角色: 销售人员
自定义属性:
region: 华东 # 用于行级权限过滤
用"张三"的账号登录,提问:"本月订单量"
自动应用权限过滤:
SELECT COUNT(*) as order_count
FROM orders
WHERE created_at >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
AND region = '华东' -- 自动添加的权限过滤
张三只能看到华东地区的数据,而不会看到全国数据。
对于敏感字段,配置脱敏规则:
手机号脱敏:
字段: customers.phone
脱敏规则: CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4))
示例: 13812345678 → 138****5678
身份证号脱敏:
字段: customers.id_card
脱敏规则: CONCAT(LEFT(id_card, 6), '********', RIGHT(id_card, 4))
示例: 110101199001011234 → 110101********1234
地址脱敏:
字段: customers.address
脱敏规则: CONCAT(SUBSTRING(address, 1, 10), '***')
示例: 北京市朝阳区建国门外大街 1 号 → 北京市朝阳区建国门***
对于常用的查询,可以创建模板,方便快速访问。
提问:"本月各产品分类的销售额和订单量"
查询成功后,点击"保存为模板":
模板名称: 月度产品分类分析
描述: 统计本月各产品分类的销售额和订单量
参数:
- 时间范围: 可选(默认本月)
- 产品分类: 可选(默认全部)
共享范围: 全公司可见
其他用户可以在"模板库"中找到这个模板:
设置定时发送:
报表名称: 每日销售简报
查询模板: 月度产品分类分析
发送频率: 每天上午 9:00
发送对象:
- zhangsan@company.com
- lisi@company.com
发送方式: 邮件
格式: PDF + Excel
原因:语义层配置不完善,AI 理解有偏差。
解决:
示例:
示例查询:
问题: "本月新增用户数"
正确 SQL: |
SELECT COUNT(DISTINCT user_id)
FROM users
WHERE DATE_FORMAT(created_at, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')
说明: "新增用户"指注册时间在本月的用户,不是活跃用户
原因:
解决:
问题:数据库中的数据实时更新,但 AskTable 查询结果有延迟。
解决:
问题:订单数据在 MySQL,用户行为数据在 ClickHouse,如何关联?
解决:
AskTable 默认会自动选择图表类型,但你可以自定义:
查询: "各地区销售额"
图表类型: 地图
配置:
地理字段: region
数值字段: gmv
颜色方案: 蓝色渐变
导出:
分享:
如果你有开发能力,可以通过 API 集成 AskTable:
import requests
# 发起查询
response = requests.post(
'https://api.asktable.com/v1/query',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'question': '本月销售额',
'datasource_id': 'your_datasource_id'
}
)
result = response.json()
print(f"销售额: {result['data']['gmv']}")
应用场景:
恭喜!你已经完成了企业级 AI 数据分析系统的搭建。
回顾:
总耗时:60 分钟
下一步:
核心价值:
实际效果(来自真实客户):
"我们是一家 50 人的电商团队,以前每天有 10+ 个临时数据需求,数据团队疲于应对。引入 AskTable 后,70% 的需求由业务人员自主完成,数据团队从'取数'工作中解放出来,专注更有价值的分析。" —— 某电商公司 CTO
开始你的数据驱动之旅:
让数据分析回归本质:简单、快速、人人可用。
相关资源: