You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Power BI DAX需求:按工作日计算月度总计值

我来帮你搞定这个需求!核心思路是先计算每个月的工作日总数,再把这个总数“广播”到该月的每一行数据里,这样就能直接和每月的目标值做除法了。下面分几种常用工具给你具体操作方法:

方法1:Excel(含Power Query)

如果是用Excel处理,有两种简单方式:

  • 公式法
    1. 先给数据加一个「月份标识」列,比如假设日期列是A列,在B2输入=TEXT(A2,"YYYY-MM"),下拉填充得到每个日期对应的年月。
    2. 再新增「当月工作日总数」列,C2输入=SUMIFS(D:D,B:B,B2)(这里D列是你的工作日标记列,1/0),下拉后每一行都会显示对应月份的工作日总数。
    3. 最后和目标值计算:如果目标值存在单独的表(比如E列是年月,F列是目标),在G2输入=C2/XLOOKUP(B2,E:E,F:F)就能得到比值。
  • Power Query法
    1. 把数据导入Power Query,添加自定义列提取年月:=Date.ToText([日期], "yyyy-MM")
    2. 点击「分组依据」,分组列选刚才的年月,新列名设为「工作日总数」,操作选「求和」,列选你的工作日标记列。
    3. 把分组后的表和原表合并(依据是年月列),合并后展开「工作日总数」列,这样原表每一行就都带上当月总数了,加载回Excel即可。
方法2:SQL(数据库场景)

如果数据存在数据库里,用窗口函数可以一步到位:
假设你的表叫daily_data,有date_col(日期列)和workday_flag(1/0标记列),目标值存在monthly_target表,有month_start(每月1日)和target_value列:

SELECT
    dd.*,
    SUM(dd.workday_flag) OVER (PARTITION BY DATE_TRUNC('month', dd.date_col)) AS monthly_workdays,
    mt.target_value,
    SUM(dd.workday_flag) OVER (PARTITION BY DATE_TRUNC('month', dd.date_col)) / mt.target_value AS ratio
FROM daily_data dd
LEFT JOIN monthly_target mt
    ON DATE_TRUNC('month', dd.date_col) = DATE_TRUNC('month', mt.month_start);

这里DATE_TRUNC('month', ...)是提取月份的函数,不同数据库写法可能略有不同:比如MySQL用DATE_FORMAT(date_col, '%Y-%m'),SQL Server用DATEFROMPARTS(YEAR(date_col), MONTH(date_col), 1)

方法3:Python Pandas

用Pandas的groupby + transform可以轻松实现广播:

import pandas as pd

# 假设你的数据框是df,包含'date'(日期列)和'workday_flag'(1/0列)
df['date'] = pd.to_datetime(df['date'])
# 提取年月作为分组键
df['month'] = df['date'].dt.to_period('M')
# 计算每个月的工作日总数,并广播到每一行
df['monthly_workdays'] = df.groupby('month')['workday_flag'].transform('sum')

# 假设目标值在另一个数据框target_df,包含'month'(年月,格式同df的month列)和'target'列
df = df.merge(target_df, on='month', how='left')
# 计算比值
df['target_ratio'] = df['monthly_workdays'] / df['target']

这样不管你用哪种工具,都能实现每个月每一行显示当月工作日总数,再和目标值做除法的需求啦!

内容的提问来源于stack exchange,提问作者user12504122

火山引擎 最新活动