汇总行

在电子表格中,我们可以对列数据进行运算,如求和、未平均值等。下面我们来看一下如何在 Dataview 查询的结果中实现对列数据的求和。

//'''dataviewjs
const query = `TABLE praying, training, situps, steps
FROM "10 Example Data/dailys"
WHERE file.day.month = 2`

const nameOfTotalRow = "Sums";

let DQL = await dv.tryQuery(query);
const sums = [nameOfTotalRow];

// 如果在 DQL 查询语句中添加了 `WITHOUT ID`,这里就需要改成从 `0` 开始遍历
for (let i = 1; i < DQL.headers.length; i++) {
    let sum = 0;
    const dataType = getDatatypeOfColumn(i, DQL.values)

    // 只有数字和持续时间的数据类型才会被计算
    if (!["number", "duration"].includes(dataType)) {
        sums.push("")
        continue;
    }

    // 计算每一列的总和
    for (let k = 0; k < DQL.values.length; k++) {
        // 行 `k`, 列 `i` 的值
        let currentValue = DQL.values[k][i];
        if (currentValue) sum += currentValue 
    }
    if (!sum) sum = ""
    sums.push(dataType === "duration" ? dv.luxon.Duration.fromMillis(sum) : sum);
}

function getDatatypeOfColumn(columnNo, values) {
    let i = 0;
    let datatype;
    while (i < DQL.values[0].length && (!datatype || datatype === "null")) {
        datatype = dv.func.typeof(DQL.values[i][columnNo])
        i++;
    }
    return datatype;
}

// 添加分隔线
let hrArray = Array(DQL.headers.length).fill('<hr style="padding:0; margin:0 -10px;">');
DQL.values.push(hrArray)
DQL.values.push(sums)

dv.table(DQL.headers, DQL.values)
//'''dataviewjs

显示效果:

posted @ 2024-09-24 14:50  汉学  阅读(41)  评论(0)    收藏  举报