tableau常⽤函数整理
当 COUNT 不可⽤时获得不重复计数
问题
如何在 COUNTD 不可⽤时获取字段的不重复计数。
环境
Tableau Desktop
答案
步骤 1: 创建 WINDOW_SUM 计算
1. 在 Tableau Desktop 中,连接到 Superstore ⽰例数据。
2. 选择“分析”>“创建计算字段”。
3. 在打开的“计算字段”对话框中,输⼊字段的名称。“COUNT 替代项”⽰例⼯作簿使⽤“Distinct Customers”(不同的客户)。
4. 在公式字段中,键⼊以下公式,然后单击“确定”:
WINDOW_SUM(MIN(1))
5. 将“Distinct Customers”(不同的客户)从“度量”拖到“列”。
6. 将需要其⾮重复计数的维度从“维度”拖到“详细信息”。⽰例⼯作簿使⽤“Customer Name”(客户名称)。
7. 右键单击“列”上的“Distinct Customers”(不同的客户),然后选择“计算依据”>“Customer Name”(客户名称)。
步骤 2: 筛选索引
1. 选择“分析”>“创建计算字段”以创建其他计算字段。
2. 在“计算字段”对话框中,键⼊该字段的名称。⽰例⼯作簿使⽤“Table Calc Filter”(表计算筛选器)。
3. 在公式字段中,键⼊以下公式,然后单击“确定”:
INDEX()=1
4. 将“Table Calc Filter”(表计算筛选器)从“度量”拖到“筛选器”,然后单击“确定”(不要勾选任何可⽤选项)。
5. 将“Product Category”(产品类别)从“维度”拖到“⾏”。
6. 右键单击“筛选器”上的表计算筛选器,选择“计算依据”>“Customer Name”(客户名称),选择“True”,然后单击“确
定”。
7.
其他信息
视图中的任何其他度量也需要使⽤表计算,如 WINDOW_SUM。
⽇期函数
dateadd
datedadd (date_part, interval, date) 表⽰在⽇期 date 的基础上, 以date_part 为单位, 与之间隔 interval
的⽇期
dateadd ("month", -3, #2020/3/8#) 则返回 2019/12/8 0:00:00;
dateadd("day", -7, #2020/3/8#) 则返回 2020/3/1 0:00:00 查看过去⼀周, 半年, 3个⽉等的⽇期会⽤到.
datediff
datediff (date_part, start_date, end_date, [start_of_week]) 计算两⽇期的差, 以 date_part 为单位.
datediff("week", #2020/3/8#, #2020/3/9#) 返回 0 , 3/8 与 3/9 相差 0 周
datediff("week", #2020/3/8#, #2020/3/9#, "monday") 返回 1 因为 3/8 是周⽇, ⼀周开始若为周⼀, 则相差⼀周啦.
isdate (string) 判断⼀个字符串是否为有效⽇期. 是则返回 "真", 否则 "伪"
isdate("2020/3/8") ; isdate("2020-03-8") 返回 "真"
makeday
makeday (year, month, day) 构造⼀个包含年, ⽉, ⽇的⽇期值, 常⽤于数据提取, ⽇期⽐较等
makeday (2020, 3, 8) 则返回 2020/3/8
maketime
maketime (hour, minute, second) 构造⼀个包含时, 分, 秒的⽇期值
maketime (8, 30, 0) 则返回 1899/12/30 8:30:00
max, min
max (date1, date2) 也可⽤于⽐较两个时间, 返回较近/ 较远的⼀个距今
max (#2020/1/1#, #2020-3-8#) 返回 2020/3/8; min 则是相反的⽤法
now
now () 返回当前的⽇期和时. 配合 date, year, month 就很灵活了.
datediff是字符型函数now () 返回 2020/3/8 23: 22:26
year(now()), month (now ()), date(now()) 分别返回 2020, 3, 2020/3/8
today
返回今天的⽇期. today () 则返回 2020/3/8 . 经常⽤作与⼀个动态的参数值. ⽐如⽇报中算环⽐, 同⽐都会⽤到
类型转换
date
将给定的 字符串, 数字, ⽇期 表达式转为⽇期类型. 常⽤于强⾏转换, ⽐如对 数据库中的各种时间强⾏转换date("2020/3/8") 和 date("2020-3-8 2:22:22") 和 date(2020, 3, 8) 都返回 2020/3/8 这样就能准确⽐较了
datetime
跟 date () ⼀样的, 只不过更加精确到 时, 分秒. 也是会⽤在时间的⽐较上的
datetime ("2020-3-8 22:22:22") 返回 2020/3/8 22:22:22; ⽽ datetime ("2020/3/8") 返回 2020/3/8 0:00:00
float, int
将表达式转为 浮点数或整数. 注意的是 int 不是四舍五⼊, ⽽是直接取整.
时间其实也是⼀个 数字类型. int (#2020-3-8#) 返回 43896; int("666") 返回 666; int("aaa") 则啥都没有. str
将表达式转为字符串类型. 可⽤于, 字符串的拼接. 如 字段拼接, 构造唯⼀值等场景. ⼤类, ⼩类 排序会⽤到
if
if 条件 then 表达式 end
if 条件 then 表达式1 else 表达式2 end
# 多层嵌套
if [当期值] > 10000
then if [同期值] > 10000
then "1好"
else "2好"
end
elseif [当期值] <= 10000 and [当期值] > 5000
then "较好"
else "不好"
end
if 产品名称 = ‘⾐服’ or 产品名称 = ‘裤⼦’ then '服装' elseif 产品名称 = ‘饼⼲’ or 产品名称 = ‘巧克⼒’ then '⾷品' else '其他' end
#语句的意思是如果产品名称为'⾐服'或者'裤⼦',那么输出'服装',如果产品名称为''饼⼲,'巧克⼒',那么输出'⾷品',如果是别的,就输出'其他'`
IF [Failure Rate Type] = 'INW' AND [保修状态] = '保内' THEN [维修量]
ELSEIF [Type] = 'OOW' AND [保修状态] = '保外' THEN [维修量]
ELSEIF [Type] = 'TOTAL' THEN [维修量]
ELSE 0
END
IF [Failure Rate Type] = 'INW' AND [保修状态] = '保内' THEN [产品保有量]
ELSEIF [Type] = 'OOW' AND ([保修状态] = '保内' OR [保修状态] = '保外') THEN [产品保有量]
ELSEIF [Type] = 'TOTAL' THEN [产品保有量]
ELSE 0
END
case
跟 if 的作⽤基本⼀样, 但使⽤更加⽅便, 尤其在返回结果⽐较多的情况下
case 表达式
when 值1 then return1
when 值2 then return2
when 值3 then return3
...
else reurnx
end
⽐如, 对 "省市" 字段进⾏ 区域的划分 (创建计算字段 "⼤区")
case [省市]
when "吉林" or "辽宁" or "⿊龙江" then "东北"
when "安徽" or "江苏" or "浙江" or "福建" then "华东"
when "江西" or "河南" or "湖北" then "华中"
else "未划分"
end
ifnull
ifnull (expr1, expr2) 如果结果不是 null, 则返回 expr1 否则返回 expr2 判断时可对 if xxx else ... 优化
ifnull ([当期值], [同期值]) 等价于, 将当期值的缺失值⽤同期值填充了.
isnull
isnull (expr) 返回布尔值. 如果表达式为 null 则返回 "真" 否则返回 "伪"
注意的是, isnull (null) 返回 "真"; isull(" ") 返回 "伪". 空字符串不是空哦, 注意跟有点编程语⾔的区分
聚合函数
Tableau 的拖拽字段到⾏列, 其实就是执⾏了⼤致 SQL: 聚合函数(度量字段) group by [维度]. 默认是 sum. 这就解释了在计算字段的时候,有的时候需要⼿动加 sum, 有时候⼜不需要. 这就需要想想它 原本的 sql ⼤致是怎样的逻辑即可
count
对离散或度量字段, 进⾏计数, 会忽略 null 值, 不去重
countd
对离散或度量字段, 进⾏计数, 会忽略 null 值, 会去重
统计门店数据量, ⼤区啥的都经常会⽤到. 注意, 表连接(混合数据源) 不能⽤ countd. 可通过 sql来 Union 解决
sum
只能对度量字段 求和, 会忽略 Null 值. Tableau 默认对度量字段聚合,要看每⼀条则在 数据 -> 取消聚合 即查看
avg
只能⽤于度量字段 求均值, 会忽略 Null 值
max, min
度量字段的最值; 传字符串则返回原值; 也可⽤做两个时间⽐较(如上提到)
attr
attr ([expr]) 如果 expr 的每⼀⾏都有值, 则返回该值. 否则返回 * , 会忽略 Null 值
median
只能⽤于度量字段, 求中位数, 会忽略 Null 值
表计算函数
total
返回给定表达式的总计, 常⽤于计算 各⾃分区中 的全部⾏的 聚合值等
total (sum([销售量])) 表⽰计算 各⾃分区中的全部⾏的 sum([销售量])
index
返回分区中当前⾏的索引, 不包含于是值相关的任何排序. 常⽤于对某个字段和 [⼿机品牌] 按特定的顺序排列
....
这部分很多, 但⽬前很多, 没⽤到, 或者是不会⽤.
详细级别函数
也称为 " LOD" 表达式 或 "LOD" 计算.
是除视图级别外, 的其他维度上⽀持聚合, 能实现将 ⼀或多个 维度 附加到 任何的聚合表达式.
与表计算, 参考线等不同在于, LOD 是在数据源中计算的. 针对⼤型数据源, 会⼤幅度提⾼性能 但同时也会导致 Tableau 运⾏更加复杂的查询 (如多表连接), 在基础数据源缓慢的情况下, 影响性能.
固定 (fixed) : 灵活选择 ⾼于 或 低于 视图层, 各个维度进⾏ group by 再 aggregation
包含 ( include): ⽤于创建 ⾼于 视图层的, 来分组聚合.
排除 ( eclude): ⽤于创建 低于 视图层的, 来进⾏分组聚合.
表达也似乎不⼤准确, 举个栗⼦就好了.
fixed
{fixed [维度1], [维度2]... : 聚合函数 (度量字段)} 表⽰ 对维度 dim1, dim2 ... 的维度进⾏聚合操作.
fixed 计算 在维度筛选器 之前应⽤, 但会受到 上下⽂筛选器, 数据源筛选器, 和数据提取筛选器的影响. 如果想要将筛选器应⽤于 fixed 表达式级别 ⽽⼜不想⽤ 上下⽂筛选器. 则可将其改为 include 或 exclude 表达式
通常⽤ fixed 这样的 LOD 表达式, 可以⽣成度量或维度.
{fixed [商品ID] : sum ([销量])} 是计算, 每件商品, 销量的总和
{fixed [商品ID], [年份] : sum ([销量]) 是计算每件商品, 每年 的销量总和
{fiexd [商品ID] : min ([订单⽇期]) 是计算, 每件商品的, 最早订单⽇期
来个栗⼦, 以超市数据为例, 计算 每个地区中, 每个省份的销售量, 先建⼀个计算字段.
然后再将 "地区" 和 "省" 放到列, 再将 地区映射到 颜⾊做区分.
与之相关的还有 include 和 exclude 的 LOD 表达式,
{fixed A:countd(B)},在维度A下对指标B进⾏去重,即可去除重复值计数。
Tableau返回当⽉的最后⼀天的⽅法
我们想显⽰某个⽉的第⼀天经常会很简单,因为第⼀天都是1号。但是每个⽉的最后⼀天却是变化的,当我们想返回某个⽉的最后⼀天要怎么办呢?
其实在Tableau中,有⼀个构造⽇期的函数‘MAKEDATE’,参数也很简单:MAKEDATE(年,⽉,⽇),可以利⽤year/month等函数将⽇期的年⽉⽇拆出来,如果是字符串如‘2020-11’的格式,可以⽤split来拆分年⽉,对于⽇期值填写1-31返回对应⽇期值,那么填写0即为上个⽉的最后⼀天,-1为上个⽉的倒数第⼆天,以此类推,那么返回当⽉最后⼀天就需要⽉份+1。因此例如给出‘2020-11’,返回2020年11⽉的最后⼀天的计算⽅法即为:
MAKEDATE(split(‘2020-11’,’-’,1),split(‘2020-11’,’-’,2)+1,0)
注:报错情况下,记得转化格式
MAKEDATE(int(split(‘2020-11’,’-’,1)),int(split(‘2020-11’,’-’,2))+1,0)
addweek oracle_Tableau技巧——⽇期函数
⼀:项⽬级别设置
菜单“数据”——“数据源”——“⽇期属性”,可以在项⽬级别对数据源中所有的⽇期字段统⼀设置如下三个属性:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论