你是否有过这样的经历:每天打开 BI 工具,看到的是一堆漂亮的仪表盘,但当你真正需要回答一个具体问题,比如“为什么华东地区上周的销售额下降了,但同一时间段的客单价却在上升”,你只能对着一个固定的报表页面,点开、关掉、再点开另一个,最后在 Excel 里手动拉透视表?
这不是你的问题,这是传统 BI 和多维分析之间,思维模式上的根本差异。传统 BI 的默认假设是“数据是已知的,问题也是已知的,我只是需要一个更好的展示方式”。而多维分析,尤其是基于 Looker 这类工具的多维分析,默认假设是“数据是未知的,问题也是未知的,我需要一个能不断追问的工具”。
过去三年,我深度参与了超过 20 个企业的数据分析平台建设项目,从电商零售、SaaS 到制造业,无一例外地遇到了同一个瓶颈:业务人员无法独立完成一个“自下而上”的探索性分析。他们被训练成“看报表的人”,而不是“问问题的人”。本文的核心观点是:多维分析不是工具的功能,而是提问的方式。Looker 只是让这种提问变得像聊天一样简单。真正改变的不是操作,而是你面对数据时的思维模型。
在和某家年营收超过 50 亿的零售企业合作时,我发现他们的数据分析团队每周要手工制作 40 多张固定报表。这些报表的维度、度量都是事先定好的,比如“上周各门店销售额”、“本月各品类销量排名”。当业务总监问“为什么这个月线上渠道的毛利率下降了 2 个百分点,但线下渠道的毛利率反而上升了”,他们需要花 3 天时间重新拉数据、写 SQL、做透视表。
这三座大山是:
这些问题的根源在于:传统 BI 是“从答案到问题”的流程,先预设好“答案”(固定的报表),然后业务人员再去找“问题”(为什么这个数字变了)。而多维分析是“从问题找答案”的流程,你有了一个模糊的疑问,然后通过不断调整维度、度量、切片,去验证或推翻假设。

让我用一个具体的例子来解释。假设你是一家电商公司的数据分析师,你的老板问:“为什么上周的转化率下降了?”
在传统 BI 中,你只能去查看“转化率趋势图”,然后发现它确实下降了。但你无法在同一个页面内,同时观察“不同渠道的转化率”、“不同新老客的转化率”、“不同品类的转化率”,并将它们交叉对比。
在多维分析中,你的工作流是这样的:
你看,整个过程不是“看报表”,而是“问问题”。你已经从“数据管理员”变成了“数据提问者”。这就是多维分析的本质:它不是一个展示工具,而是一个探索工具。
这是我和很多分析师沟通时,发现的最大误区。很多人认为“维度”就是数据库里的字段,比如“订单日期”、“用户ID”、“地区”。但我在实际项目中,更倾向于把维度理解为“视角”。
同一条数据,使用不同的视角,会呈现出完全不同的信息。比如,一条交易记录:
这就是为什么在 Looker 中,维度可以任意组合。你不需要预先定义好“用户-时间-产品”这个组合,而是可以根据当前的问题,自由地选择视角。我称之为“维度思维”:当你面对一个数据问题时,首先要问自己“我该从哪个视角来看它?”
很多人在理解度量时,犯的另一个错误是把度量等同于“数值”,比如“销售额”、“订单量”。但在我看来,度量是“答案”。它回答的是你提出的问题。
当你问“这个月表现如何?”时,你需要一个“答案”,比如“销售额(度量)”。当你问“哪个渠道表现更好?”时,你需要另一个“答案”,比如“各渠道的转化率(度量)”。
在 Looker 中,度量的定义是灵活的。你可以通过 LookML 定义复杂的聚合逻辑,比如:
measure: 毛利率 {
type: number
sql: (${销售额} - ${成本}) / ${销售额} ;;
value_format: "0.00%"
}注意,这里的“毛利率”不是一个简单的字段,而是一个基于两个字段计算出来的“答案”。关键点在于:度量应该和你的“问题”直接对应。如果你问“利润如何”,你需要的度量是“利润”;如果你问“效率如何”,你需要的度量可能是“毛利率”或“客单价”。
假设你是一家连锁零售企业的分析负责人。你看到一张“全国销售额地图”,发现华东地区的销售额下降了。你不会满足于只看到“华东”这个级别,你一定会想:“是华东哪个城市?哪个门店?哪个品类?”
这就是层次结构的意义。在 Looker 中,你可以定义一个维度层次结构:
dimension: 地区 {
type: string
sql: ${TABLE}.地区 ;;
}
dimension: 城市 {
type: string
sql: ${TABLE}.城市 ;;
}
dimension_group: 门店 {
type: string
sql: ${TABLE}.门店 ;;
}
在 Explore 中,通过定义 hierarchy 来实现钻取
explore: 销售 {
hierarchy: [地区, 城市, 门店]
}这样,业务人员就可以在分析报告中,从一个“地区”的总体数据,点击进入“城市”级别,再点击进入“门店”级别。这个机制,我称之为“数据导航系统”。它让你从宏观的“看全景”到微观的“看细节”,中间没有断裂。
在 Looker 中,切片(Slice)是对单一维度的筛选,比如“只看华东地区的销售额”。切块(Dice)是对多个维度的筛选,比如“只看华东地区、2024年3月、高客单价产品的销售额”。
我经常告诉团队,一个好的分析问题,本质上就是一个“切片+切块”的组合。比如:
你能提出多精准的切片与切块组合,就决定了你的分析能有多深入。在 Looker 中,这个操作是零门槛的,你只需要在筛选器中拖拽维度即可。但真正的能力在于,你是否能想出那个“关键的问法”。

我们以一家模拟的电商公司为例,核心数据表是“订单表”,字段包括:订单日期、用户ID、渠道来源、商品ID、商品品类、销售额、成本、数量。
业务目标是:分析“不同渠道下的商品毛利”,并进行归因。
在 Looker 中,我们首先需要创建一个 LookML 模型文件。这个模型是 Looker 的语义层,定义了数据源、维度、度量和关联关系。它让业务人员无需写 SQL,就能用自然语言理解数据。
维度是分析视角,它们决定了我们能从哪些角度探索数据。
view: 订单 {
dimension: 订单日期 {
type: date
sql: ${TABLE}.订单日期 ;;
}
dimension: 渠道来源 {
type: string
sql: ${TABLE}.渠道来源 ;;
}
dimension: 商品品类 {
type: string
sql: ${TABLE}.商品品类 ;;
}
dimension_group: 用户 {
type: string
sql: ${TABLE}.用户ID ;;
}
}在这个例子中,我们定义了“时间”、“渠道”、“品类”、“用户”这四个核心维度。注意,维度的选择需要和业务问题强相关。如果业务痛点在于“转化率”,那么“用户”和“渠道”就是必选维度;如果痛点在于“库存”,那么“品类”和“时间”就是核心。
度量是数据答案,它们定义了我们需要计算的值。
measure: 销售额 {
type: sum
sql: ${TABLE}.销售额 ;;
}
measure: 成本 {
type: sum
sql: ${TABLE}.成本 ;;
}
measure: 毛利 {
type: number
sql: ${销售额} - ${成本} ;;
}
measure: 毛利率 {
type: number
sql: (${销售额} - ${成本}) / ${销售额} ;;
value_format: "0.00%"
}
measure: 订单量 {
type: count
sql: ${TABLE}.订单ID ;;
}这里的关键点是:度量的定义要清晰,且最好能直接对应一个业务概念。比如“毛利率”在业务中就是“毛利/销售额”,如果你定义为“利润/成本”,就会导致口径不一致,后续分析都会出错。
在 Looker 的 Explore 界面,业务人员可以拖拽上述维度和度量,生成一个多维分析页面。比如:
这样,我们就得到了一个“2024年3月各渠道各品类的销售额与毛利率”的表格。点击“搜索广告”这个渠道,可以继续下钻到“搜索广告”下的“商品品类”维度,进一步分析是哪个品类拖累了毛利率。
这个过程中,业务人员不需要写任何 SQL。他们只需要“想问题”和“拖拽”。这就是 Looker 的“语义层”带来的价值:把复杂的 SQL 逻辑,封装成业务人员能理解的“维度”和“度量”。
在实际业务中,我们经常需要做动态分组。比如,把“客单价”分为“高、中、低”三档,或者把“用户”分为“新客、老客”。
在 Looker 中,你可以通过 “case when” 语句来实现:
dimension: 客单价分组 {

四、进阶技巧,让多维分析“快”且“准”
1. 性能优化:合理使用持久化派生表(PDT)和数据缓存
多维分析的一个核心矛盾是:探索的灵活性越高,查询的复杂度就越高,性能就越容易下降。当你的数据量达到千万级甚至亿级时,一个简单的“下钻”操作,可能就需要几十秒甚至更久。
我在一个日数据量超过 500 万行的项目中,遇到了这个瓶颈。业务人员想要分析“用户行为路径”,计算量非常大。解决方案是:使用 Looker 的持久化派生表 (PDT)。
PDT 允许你将一个复杂的查询结果预先计算并存储为一张表,然后分析师可以像查询普通表一样查询它。比如:
explore: 用户行为路径 {
derived_table: {
sql: SELECT
user_id,
session_id,
MIN(event_time) AS 首次事件时间,
MAX(event_time) AS 最后事件时间,
COUNT(DISTINCT event_type) AS 事件类型数
FROM events
GROUP BY 1, 2 ;;persistence_strategy: "datagroup_trigger"
}
}
这样,“用户行为路径”这个复杂的聚合查询,就不再需要每次分析时都重新计算。我建议的实践是:对于任何需要频繁访问且计算量大的多维分析场景,都应该考虑使用 PDT。但要注意,PDT 会占用存储空间,且需要定期刷新,需要权衡。
这是我在企业服务中遇到的最常见问题之一。同一个指标,比如“毛利率”,销售部门定义为“毛利/销售额”,财务部门定义为“(销售额-成本)/(销售额+运费)”,结果导致跨部门沟通时,双方说的“毛利率”根本不是一回事。
Looker 的 LookML 语义层,天然解决了这个问题。因为所有维度和度量的定义,都是在一个地方(LookML 文件)中定义的。一旦定义好,全公司的分析师、业务人员,看到的都是同一个“毛利率”。
比如,我们在 LookML 中定义:
measure: 毛利率 {
type: number
sql: (${销售额} - ${成本}) / ${销售额} ;;
value_format: "0.00%"
}那么,所有使用这个模型的报表、探索,都会使用这个统一的定义。我建议的实践是:在项目初期,就建立一个“数据字典”文档,并确保 LookML 中的每个维度和度量,都与业务字典一一对应。
在大型企业中,数据权限是刚需。比如,销售团队只能看自己负责的地区的销售数据,财务团队只能看财务相关的数据。
Looker 提供了基于维度的行级安全控制。你可以在 LookML 中定义一个“访问控制”维度,然后通过用户属性来限制可见数据行。例如:
explore: 销售 {
access_filter: {
field: 地区
user_attribute: 用户所属地区
}
}这样,当用户登录时,Looker 会自动读取其“用户所属地区”这个属性,然后只展示该地区的数据。它确保了不同团队之间数据的隔离,同时又能共享同一个分析模型,避免了数据孤岛。

回顾整篇文章,我想再次强调那个核心观点:多维分析不是工具的功能,而是提问的方式。你不需要成为一个 SQL 专家,你只需要成为一个“问题专家”。你问的问题越好,你的分析就越有价值。
从“数据管理员”到“数据提问者”,这个转变需要你主动去练习。我建议你从今天开始,对业务问题保持好奇,用“为什么”去追问,而不是被动等待报表。
如果你刚刚开始接触 Looker 的多维分析,我建议你从这三个场景开始练习,它们覆盖了最常见的分析需求:
纸上得来终觉浅,真正的理解来自于操作。我建议你找到一份真实的业务数据(比如你公司的销售数据、用户行为数据),然后做以下几步:
你可能会遇到一些问题,比如“维度定义错了”、“查询太慢了”。别担心,犯错本身就是学习过程的一部分。记住,你不是在学一个工具,你是在学一种思维方式。当你开始用“维度”和“度量”去思考问题时,你就已经迈出了成为“数据提问者”的关键一步。
我在用Looker分析公司销售数据时,把订单金额按产品类别和按地区分开查看,两者的总额竟然对不上。明明是同一个订单表,用Explore查出来的数字为什么不一样?是Looker算错了,还是我的维度设计有问题?
这是多维分析中典型的“聚合陷阱”,不是Looker的bug。核心原因在于:Looker的度量是在join后的明细行上做SUM,而这个明细行的粒度可能比订单粒度更细。我去年帮一家电商客户搭建GMV看板时就踩过这个坑。
他们的订单金额存在orders表(一行一单),但Explore里又关联了订单明细表order_items(一行一个SKU),order_items通过order_id与orders多对一。
当业务按SKU按地区下钻时,Looker会先把这些表LEFT JOIN在一起,JOIN后每一行代表“订单-商品-地区”的明细,SUM(订单金额)自然把同一笔订单在多个SKU上重复计算。结果GMV被放大了3.2倍。
解决方式有三种:第一,在LookML中正确配置join关系,明确relationship: one_to_many,并且把订单金额这类“半可加”字段放到订单表视图里,不要在订单明细视图里重复引用同一字段;第二,将度量改成sum_distinct,但那只适合去重的场景,不能从根本上解决;
第三,也是我最推荐的,先对订单表做粒度汇总,再把汇总结果与明细维表关联,也就是用Looker的聚合表或PDT。
判断方法很简单:在Looker的SQL Runner里直接执行`SELECT COUNT(*) FROM orders o LEFT JOIN order_items oi ON o.order_id = oi.order_id`,对比`COUNT(*) FROM orders`。如果行数变了,你的模型设计就有放大风险。我还会用一条“一致性校验规则”时时监控:计算订单金额总和 / 订单金额去重总和,如果比例偏离1,就触发告警。更重要的是一开始就明确度量的“可加性”:可加度量(如订单数)可以直接SUM;半可加度量(如金额、库存)要小心关联;
不可加度量(如去重用户数、比率)则要用专门的聚合逻辑,不能简单SUM。经验之谈:真正的多维分析不是“拖来拖去”,而是“在正确粒度上拖来拖去”。建模前先画一张实体关系图,把所有join路径的基数标出来,能避免后面80%的数据对不上问题。
我照着教程用Looker的Explore做透视分析,把月份拖到行,把渠道拖到列,再把销售额放进去,结果表很长,而且很多空值,看起来超乱。到底透视表适合什么时候用?需要怎么设置才对?
透视表的本质是行转列,与普通分组的关键差异在于:普通分组让每个维度占一行,数据呈“长表”;透视表把一个维度的值展开为多列,数据呈“宽表”。宽表适合横向对比,但它对列的数量有限制,操作不当就会乱。我多年用Looker的实践是:只有列维度基数很小(少于30个)且业务含义稳定时,才用透视。
比如全国区域(华东、华南、华北)、渠道(线上、门店、分销)、产品线。不应该放日期、用户ID、订单ID这类高基数字段,否则会生成几百列,浏览器跑不动,看也看不清。透视表混乱通常有三个原因:第一,没有把不需要的维度移出“行/列”区,导致度量被重复计算成多套。
第二,没有设置“空值显示”选项,缺数据的地方全是空白,用户不知道是0还是没数据。第三,列没有按业务逻辑排序,按字母序排列,最关注的“新锐渠道”被排到了最后面。我的操作流程是:打开Explore后,先把要展示的维度放入“行”和“列”区域,把度量放在“值”区域;
接着在“数据”设置里勾选“Fill empty spaces with 0”,让缺失值变为0;最后在列的排序设置里选一个关键度量(如最近一个月销售额)降序排列,让最重要的列排在最前面。这样生成的透视表才会一目了然。
我还常用一个LookML小技巧:在维度定义里加html参数自定义列标题,比如“本季度”“上季度”,这样透视表的列头就不再是冷冰冰的日期。此外,也可以用pivot_column来固定透视列,限制用户自由拖拽,避免“乱”的产生。专家判断:不要把透视表当万能工具。
多维分析有四个常用动作:钻取(Drill-down)看层析,切片(Slice)看子集,切块(Dice)看交叉,旋转(Pivot)换视角。真正的效率来源于会组合这些动作,而不是把所有动作都堆在同一张表里。遇到需要多维度对比的场景,先试着用“普通分组+过滤条件”拆成多个图表,往往比一张大宽表更清晰。
我们公司市场部看的新客数和销售部看的新客数总是不一样,因为一个是按注册时间算,一个是按首次下单时间算,两个数都对但没对齐。用LookML能解决这个问题吗?该怎么设计数据模型才能让大家都用同一个指标?
能,LookML的价值就在于把业务指标变成“可复用的标准化资产”,但它不是自动对齐的,需要你主动把口径“固化”到模型里。我曾经给一家SaaS公司做过数据治理咨询,第一次开会就发现“新客”有7种定义。市场部认为是“首次访问网站”的客户,销售部认为是“首次下单”的客户,财务部认为是“首次开票”的客户。
每个人都在自己的Excel里用不同条件统计,所以数字对不上。我的方案分四步:第一步,建立统一的客户维度表,把注册日期、首访日期、首单日期、首票日期分别定义为不同字段,每个字段都写上业务说明。
第二步,在事实表(订单)中用SQL窗口函数打标,比如ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_time),当序列为1时就是首单。
第三步,在LookML里创建三个不同名称的指标:new_customer_by_registration、new_customer_by_first_order,并用description写明适用范围。
第四步,在共享视图里只暴露一个“新客数”指标,它的口径默认取“首单时间”,其他口径作为隐藏字段,只有管理员能看到。技术上的关键细节:LookML的dimension和measure都支持sql参数,你可以在里面写子查询或CASE WHEN,但不要直接引用其它视图的字段,否则会带来耦合。
对于需要跨表关联的字段,我会在模型层用join把需要的表暴露出来,并在measure的sql中使用${view_name.field_name}引用,这样每个指标都有唯一的“血统”溯源。
除此之外,Looker还提供access_filter和row_level_security,可以保证不同部门看到的数据行是隔离的,但指标定义仍然来自同一个模型。例如销售只看自己负责区域的客户,市场看全部线索,但他们看到的“新客数”都指向同一个MRR口径。
我的判断是:如果公司不是只有一个分析师,而是多个团队都在做分析,那一定要在LookML上做统一治理,否则后面一定出乱子。治理的颗粒度应该细化到:每个字段有owner,每个指标有变更记录,每个看板的数据源都来自同一个模型。避坑提醒:不要允许业务人员直接基于原始表自己创建新字段。
Looker的extension能力会让用户通过“定制字段”临时增加计算,这虽然灵活,但会形成“数据野马”。我的做法是在Looker的配置中关闭或限制“创建定制字段”的权限,所有新指标必须进入走变更流程,先注释、再测试、后发布。
我们现在用Excel做报表,数据量一大就卡死,领导希望业务人员能自己拖拽看数。网上都说Looker不错,但担心成本高、学习曲线陡,而且数据分析师也不多。我们到底该不该迁移?怎么评估值不值?
从Excel到Looker,不是换工具,而是换一种工作方式。值不值,主要看四个条件:数据量是否超过百万行、是否有多人对同一指标定义有争议、是否希望把分析逻辑沉淀下来、是否有专职的数据分析师。我用一个金融客户的案例说明评估过程。
他们当时有500万行交易明细,Excel透视表一拖就崩溃,而且每个部门报出的“转化率”都不一样。我们先用四周做试点:第一周搭建数仓底表,第二周用LookML定义20个核心指标,第三周让业务在Explore中自助分析,第四周对比他们原有日报的产出时间。
结果:原来每天上午花2小时手工整理Excel,现在看板自动刷新,分析时间从120分钟降到15分钟。迁移决策中最关键的五个点: 1. 数据源:Looker本身不存数据,它直连你的数据仓库。
如果你的原始数据还在Excel或业务系统里,要先保证有一个可查询的云数仓(如BigQuery、Snowflake等),否则Looker跑不起来。2. 建模能力:Looker的价值来自LookML,需要有人会写代码。如果没有一个能写SQL的人,建议先招一个全职的数据分析师,再谈上线。
否则团队只会把Looker当成更贵的Excel。3. 成本:Looker按用户数订阅,且通常有年费。但算一笔账:一个数据分析师月薪1.5万,如果用Looker能省出每天2小时,一年下来就是上千人时,成本就回来了。当然,如果公司只有5个人,那Excel或轻量BI更合适。
性能:Looker的查询性能取决于数仓的运算速度。如果你的数仓很慢,Looker再快也没用。使用Looker的PDT可以把聚合后的结果缓存到数仓,显著提升大表查询效率,但这需要提前规划。5. 权限与安全:Looker的行级安全可以精确到某个人看某几个客户的订单,这是Excel难以实现的。
如果你有严格的数据访问控制需求,Looker是很大的加分项。我的专家判断是:不要被“指标字典”“语义层”这些词吓到,它们其实是为了让分析结果更可信。如果你们的团队还在“各算各的数”,迁移到Looker的收益最大;如果你们只是需要一个好看的报表展示,那可能Power BI就够用。
最后给一个避坑警告:很多企业迁移失败,不是因为Looker不好,而是因为上层想要快速见效,却不给建模时间。Looker上线前至少留出2周做数据建模和口径统一,否则业务人员连原始表后做出来的第一个“搞笑数字”就会毁掉项目信任。


读者评论
作为数据分析师,非常认同文章里“传统BI是看报表,多维分析是问问题”的概括。实际工作中,业务部门常被固定报表困住,遇到新问题只能排队等提数。Looker这种语义层确实能释放业务方的探索能力,但前提是底层模型设计得足够清晰,否则维度自由组合反而容易产生误导。
从一个业务管理者的角度看,文章案例很真实。我们团队也面临类似困境,大家只会看现成报表,遇到异常就靠猜。多维分析听起来不错,但落地时更关键的可能是数据质量和人员的分析习惯。工具只是辅助,思维转变才是最难的部分。
文章里“维度是视角,度量是答案”这个比喻挺有启发,对理解Looker的LookML建模很有帮助。不过实操部分稍微浅了一点,比如大数据量下的性能优化、派生表的使用没有深入展开。对于刚入门的人是不错的思维引导,但要落地项目还需要更多实践。