我有两个返回客户平均年龄的查询,我正在尝试将它们的列合并到一个表中,但问题是当我将它们与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
答案 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)。