如何在保留列名的同时连接两个表?

时间:2015-11-07 06:26:37

标签: sql-server

我有两个返回客户平均年龄的查询,我正在尝试将它们的列合并到一个表中,但问题是当我将它们与UNION一起加入时,它只返回第一个查询中的一列。

SELECT AVG(C.income) AS "<50"
FROM Customer C
WHERE DATEDIFF(YEAR, C.birthDate, GETDATE()) < 50
UNION
SELECT AVG(C1.income) AS ">50"
FROM Customer C1
WHERE DATEDIFF(YEAR, C1.birthDate, GETDATE()) > 50

这只返回一列,其中包含所有数据

&LT; 50

但是我想要这个,我有两个查询中的两列

&lt; 50 | &GT; 50

2 个答案:

答案 0 :(得分:2)

我认为这会产生您想要的输出:

SELECT a.*, b.*
FROM
(  
   SELECT AVG(C.income) AS "<50"
   FROM Customer C
   WHERE DATEDIFF(YEAR, C.birthDate, GETDATE()) < 50
) AS a,
(
   SELECT AVG(C1.income) AS ">50"
   FROM Customer C1
   WHERE DATEDIFF(YEAR, C1.birthDate, GETDATE()) > 50
) AS b  

答案 1 :(得分:1)

你想要的是条件聚合

SELECT AVG(CASE 
             WHEN DATEDIFF(YEAR, C.birthDate, GETDATE()) < 50 THEN C.income
           END) AS "<50",
       AVG(CASE 
             WHEN DATEDIFF(YEAR, C.birthDate, GETDATE()) > 50 THEN C.income
           END) AS ">50"
FROM Customer C

这将返回包含两列的单行:一列用于<50,另一列用于>50客户。

注意:ELSE表达式中省略了 CASE。如果WHEN谓词的计算结果为false,则CASE会返回NULL,因此相应的行不会参与AVG计算(信用转到@Samrat Alamgir)。