原文地址:https://www.cnblogs.com/liqinglucky/p/ob-dataview.html
使用场景
上次我们讲过用dataview写周报obsidian dataview写周报:统计一周内的文件 - liqinglucky - 博客园 (cnblogs.com)。现在考虑另一个场景,年底要写年报,将一年的工作汇总。但通常不是像周报那样只是简单的罗列,还需要按照不同的项目内容分类汇总。这种情况就可以通过obsidian dataview按照每个文件的标签分类统计。
被统计文件的格式要求
参考:Adding Metadata - Dataview (blacksmithgu.github.io)
同样按之前的文章中的方法创建的三个工作文件,但使用了不同的标签。
工作任务1.md
---
type: 工作任务
issueId: issue-001
theme: 任务:写项目计划
status: 完成
createTime: 2023-12-16
finishTime: 2023-12-16
tags:
- 项目1 <<< 标签
---
工作任务2.md
和工作任务3.md
采用相同的属性和标签。
--
type: 工作任务
issueId: issue-002
theme: 任务:查资料
status: 完成
createTime: 2023-12-23
finishTime: 2023-12-23
tags:
- 项目1 <<< 标签
- 调研
---
工作按项目统计
关键问题是我想把工作任务按项目关键词分类。首先是针对不同的文件使用不同的标签,这里我有两类标签项目1
标签和项目1,调研
标签。我期望的是能把不同标签的任务放一起。
方案1:按照tags排序显示
使用排序语法
SORT tags ASC
代码:
TABLE
tags as "项目", issueId as "编号", theme as "任务", createTime as "启动时间", finishTime as "完成时间"
WHERE type = "工作任务" AND createTime >= date(today) - dur(12 month)
SORT tags ASC
效果:
之前提到过,dataview的最小单元是文件,所以一个文件是占一行的。这种方式把相同标签的放相邻行。
方案2:按照tags分组显示
为了让相同的项目内容可以更集中,可以使用分组语法
GROUP BY file.etags
但这里要注意,分组后,为了让两个文件的同一属性合并在同一行。需要使用语法:
rows.属性
TABLE格式
代码:
TABLE
rows.issueId, rows.theme as "任务", rows.createTime as "启动时间", rows.finishTime as "完成时间", rows.file.link as "文件"
WHERE type = "工作任务" AND createTime >= date(today) - dur(12 month)
GROUP BY file.etags as "项目"
效果:
这样相同标签的就集中到一行了。
LIST格式
代码:
LIST rows.theme
where type = "工作任务" AND createTime >= date(today) - dur(3 month)
//sum函数使得条目扁平化
GROUP BY sum(file.etags)
效果:
方案3:按照tags分表显示
更进一步,想按不同项目标签分不同的表格。研究了官方给的用例Codeblock Examples - Dataview (blacksmithgu.github.io)。使用dataviewjs 可以达到效果,有兴趣的就可以学习下JavaScript语法。
示例代码:
for (let group of dv.pages("#项目1").groupBy(p => p.tags)) {
dv.header(3, group.key);
dv.table(["Name", "文件时间", "任务"],
group.rows
.sort(k => k.file.cday, 'desc')
.map(k => [k.file.link, k.file.cday, k.theme]))
}
效果: