我使用的是sql server 2014,我有下面的t-sql查询,它应该计算基于两个特定期间的总收入差异。执行计算的数据来自一个sql表。
总而言之,我在表中有一列 T1
打电话 Revenue
另一个专栏叫 Month
. 我需要找出2020年9月至2020年12月与2019年9月至2019年12月的收入差异。
我的t-sql查询如下:
USE [MyDatabase]
;with cte1 as
(
SELECT
sum ([Revenue]) as 'Revenue Sep 19 - Dec 19'
FROM
[T1]
WHERE
[Month] between '2019-09-01' and '2019-12-01'
),
cte2 as (
SELECT
sum ([Revenue]) as 'Revenue Sep 20 - Dec 20'
FROM
[T1]
WHERE
[Month] between '2020-09-01' and '2020-12-01'
),
cte3 as (
SELECT
cte2.[Revenue Sep 20 - Dec 20] as 'Total Revenue',
'Sep 20 - Dec 20' as 'Period',
'1' as 'ID'
FROM
[cte2]
UNION ALL
SELECT
cte1.[Revenue Sep 19 - Dec 19] as 'Total Revenue',
'Sep 19 - Dec 19' as 'Period',
'1' as 'ID'
FROM
[cte1]
)
select a.[Total Revenue] - b.[Total Revenue]
from
(select cte3.[Total Revenue] from [cte3] where cte3.[Period] = 'Sep 20 - Dec 20') a
JOIN
(select cte3.[Total Revenue] from [cte3] where cte3.[Period] = 'Sep 19 - Dec 19') b
ON b.[ID] = a.[ID]
我的查询基于以下内容:如何在同一表的不同行组之间进行计算
但是,在运行查询时,我收到以下错误消息:
列名“id”无效。
我不知道我在这里做错了什么。不是列吗 ID
出现在 cte3
?
4条答案
按热度按时间30byixjq1#
ID
必须出现在两者的选择列表中a
以及b
为了让公众能看到它join
:b1zrtrql2#
你的查询比必要的复杂多了。
你的版本有三个CTE,一个
UNION ALL
,两个子查询和JOIN
.笔记:
不要使用单引号分隔列别名。字符串和日期只能使用单引号。
为列命名别名,这样就不需要转义。例如,使用下划线而不是空格。
不要使用无意义的表别名,例如
a
以及b
. 使用有意义的词,例如t2019
.1dkrff033#
使用时
SUB QUERY
您还必须提到您在连接条件中提到的列fcipmucu4#
尝试下面的代码,它将帮助你