如何在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
相关产品推荐
相关产品推荐

