You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server中连接两个指定的SQL查询语句?

如何合并两个年度金额统计的SQL查询

嘿,我来帮你搞定这个问题!你手头的两个查询分别统计了2008和2009年指定单位的活动金额,想要把它们连接起来的话,主要有两种常用方式,取决于你想要的最终输出格式:

方式一:行合并(把两年的数据上下拼接)

如果希望结果是每行对应一个活动+年份的金额,可以用 UNION ALL(或者 UNION)来拼接两个结果集。UNION ALL 会保留所有行(包括重复的活动记录),性能也比 UNION 更好;UNION 会自动去重,但需要额外的计算开销。

这里建议给结果加一个Year列,方便区分是哪一年的数据,示例代码如下:

SELECT 
    Activity, 
    SUM(Amount) AS "Total Amount", 
    '2009' AS Year
FROM Activities, Incomes 
WHERE Activities.UnitName = ? 
  AND Incomes.ActivityId = Activities.ActivityID 
GROUP BY Activity 

UNION ALL

SELECT 
    Activity, 
    SUM(Amount) AS "Total Amount", 
    '2008' AS Year
FROM Activities, Incomes2008 
WHERE Activities.UnitName = ? 
  AND Incomes2008.ActivityId = Activities.ActivityID 
GROUP BY Activity 
ORDER BY Activity, Year;

注意:两个查询返回的列数和列类型必须一致,所以这里统一了列别名,并且新增了Year标识列。

方式二:列合并(把同一活动的两年金额放在同一行)

如果希望每个活动只占一行,同时显示2008和2009年的金额,就需要用JOIN来关联两个统计结果。推荐用LEFT JOIN,这样即使某个活动在某一年没有收入数据,也能保留该活动的记录(金额显示为0或者NULL)。

示例代码(改用更清晰的显式JOIN语法,代替原查询的隐式逗号连接):

SELECT 
    a.Activity,
    -- 用COALESCE把NULL转为0,避免空值显示
    COALESCE(t2009."Total Amount 2009", 0) AS "Total Amount 2009",
    COALESCE(t2008."Total Amount 2008", 0) AS "Total Amount 2008"
FROM Activities a
-- 子查询先统计2009年各活动的总金额
LEFT JOIN (
    SELECT ActivityId, SUM(Amount) AS "Total Amount 2009"
    FROM Incomes
    GROUP BY ActivityId
) t2009 ON a.ActivityID = t2009.ActivityId
-- 子查询统计2008年各活动的总金额
LEFT JOIN (
    SELECT ActivityId, SUM(Amount) AS "Total Amount 2008"
    FROM Incomes2008
    GROUP BY ActivityId
) t2008 ON a.ActivityID = t2008.ActivityId
WHERE a.UnitName = ?
ORDER BY a.Activity;

这种方式的优势是结果更紧凑,方便对比同一活动的年度数据。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:50:25