SQL Server聚合查询需求:员工号1的Period聚合结果单行输出
嘿,我来帮你搞定这个SQL需求!先明确下你的核心诉求:针对员工号1的数据,按周期汇总Actual,同时把全局Actual总和、各周期的Actual汇总和对应的Budgeted都输出成一行。下面给你两种实用的解决方案,适配不同的场景:
先看你的原始数据
| empno | Period | Actual | Budgeted |
|---|---|---|---|
| 1 | May | 12.0 | 22.1 |
| 1 | May | 6.0 | 22.1 |
| 1 | June | 1.5 | 40.4 |
| 1 | June | 8.9 | 40.4 |
方案一:固定列的单行结果(推荐用于报表/程序处理)
这种方法用条件聚合实现,几乎所有主流SQL数据库(MySQL、PostgreSQL、SQL Server、Oracle等)都支持。它会把每个指标单独作为一列输出,结构清晰,非常适合后续的程序处理或者报表展示。
SELECT -- 所有Actual的总和 SUM(Actual) AS total_actual, -- May的Actual汇总 SUM(CASE WHEN Period = 'May' THEN Actual ELSE 0 END) AS may_actual, -- May对应的Budgeted(同一周期值相同,用MAX/AVG/MIN都可以) MAX(CASE WHEN Period = 'May' THEN Budgeted END) AS may_budgeted, -- June的Actual汇总 SUM(CASE WHEN Period = 'June' THEN Actual ELSE 0 END) AS june_actual, -- June对应的Budgeted MAX(CASE WHEN Period = 'June' THEN Budgeted END) AS june_budgeted FROM your_table_name -- 把这里替换成你的实际表名 WHERE empno = 1;
执行后你会得到这样的单行结果:
| total_actual | may_actual | may_budgeted | june_actual | june_budgeted |
|---|---|---|---|---|
| 28.4 | 18.0 | 22.1 | 10.4 | 40.4 |
方案二:动态拼接的单行文本(适用于周期不固定的场景)
如果你的Period可能会新增(比如后续加入July、August),不想每次修改SQL,那可以先按周期汇总,再把结果拼接成单行的键值对文本。以MySQL为例:
WITH period_summary AS ( -- 先按周期汇总每个月的Actual和Budgeted SELECT Period, SUM(Actual) AS period_actual, MAX(Budgeted) AS period_budgeted FROM your_table_name WHERE empno = 1 GROUP BY Period ), total_summary AS ( -- 计算全局的Actual总和 SELECT SUM(Actual) AS total_actual FROM your_table_name WHERE empno = 1 ) -- 把所有结果拼接成单行文本 SELECT CONCAT( 'total_actual: ', total_actual, ', ', GROUP_CONCAT( CONCAT(Period, '_actual: ', period_actual, ', ', Period, '_budgeted: ', period_budgeted) SEPARATOR ', ' ) ) AS single_row_result FROM period_summary, total_summary;
执行后会得到类似这样的单行输出:total_actual: 28.4, May_actual: 18.0, May_budgeted: 22.1, June_actual: 10.4, June_budgeted: 40.4
小提示
- 同一周期的Budgeted值是相同的,所以用
MAX()、MIN()或者AVG()都能正确拿到这个值,这里用MAX()逻辑上更直观; - 如果是其他数据库(比如PostgreSQL),把
GROUP_CONCAT换成STRING_AGG就能用啦。
内容的提问来源于stack exchange,提问作者Jyothi Srinivasa
相关产品推荐
相关产品推荐

