很难构建聚合 SQL 查询
Having a hard time building an aggregate SQL query
我是 SQL 的新人,对基本知识有很好的了解,但我无法满足我的要求。
我的请求得到了以下 table(右端最后一列除外):
Team
Variable
Date
Value
Column_I_need_to_add
A
aa
2022/05/01
100
0
A
aa
2022/06/01
25
0
A
aa
2022/07/01
580
0
A
ad
2022/08/01
50
605
B
aa
2021/05/01
75
0
B
aa
2021/06/01
110
0
B
aa
2021/07/01
514
0
B
ad
2021/08/01
213
624
我无法回头的是,如何通过对同一团队的 aa 变量的值求和来为填充广告变量行的最后一列编写代码,但仅限于日期之前的两个月广告变量。
这是我目前的脚本,它为我提供了前四列:
SELECT
team.Team,
Var.Variable,
TO_DATE(Var.Year||'-'||LPAD(Var.Month,2,'00')||'-'||'01','YYYY-MM-DD')AS Date ,
Var.value
FROM table1 as Var
join table2 as team
on Var.code=team.code
---This last join with table3 is only there to add other columns that are not relevant to this problem.
---join table3 as detail_var on Var.variable=detail_var.code_var
我对之前的答案不满意,通过进一步阅读可以理解,OUTER APPLY。所以不得不做一些进一步的研究,这就是我想出的(现在是 Postgres 13)。
它更干净,并且以更简洁的方式完成工作。我还添加了一个 FIDDLE LINK
。如果您想查看以前的答案,请查看编辑版本。
SELECT
team.Team
,var.Variable
,var.Date
,var.value
,CASE
WHEN var.Variable='ad' THEN
(SELECT sum(value) FROM table1
WHERE
(TO_DATE(Year||'-'||LPAD(Month::varchar(2),2,'0')||'-'||'01','YYYY-MM-DD')
BETWEEN (var.Date - INTERVAL '2 month') AND var.Date)
AND Variable = 'aa'
AND code = var.code)
ELSE null
END as past2monthsValue
FROM (
-- this sub query to change Year & Month to Date Type Value
-- this Date Type Value (Date) will be used to compare dates
-- (var.Date) in the above sub-query
SELECT
code,
Variable,
TO_DATE(Year||'-'||LPAD(Month::varchar(2),2,'0')||'-'||'01','YYYY-MM-DD') AS Date,
value
FROM table1
) var
JOIN table2 AS team ON var.code=team.code
我是 SQL 的新人,对基本知识有很好的了解,但我无法满足我的要求。
我的请求得到了以下 table(右端最后一列除外):
Team | Variable | Date | Value | Column_I_need_to_add |
---|---|---|---|---|
A | aa | 2022/05/01 | 100 | 0 |
A | aa | 2022/06/01 | 25 | 0 |
A | aa | 2022/07/01 | 580 | 0 |
A | ad | 2022/08/01 | 50 | 605 |
B | aa | 2021/05/01 | 75 | 0 |
B | aa | 2021/06/01 | 110 | 0 |
B | aa | 2021/07/01 | 514 | 0 |
B | ad | 2021/08/01 | 213 | 624 |
我无法回头的是,如何通过对同一团队的 aa 变量的值求和来为填充广告变量行的最后一列编写代码,但仅限于日期之前的两个月广告变量。
这是我目前的脚本,它为我提供了前四列:
SELECT
team.Team,
Var.Variable,
TO_DATE(Var.Year||'-'||LPAD(Var.Month,2,'00')||'-'||'01','YYYY-MM-DD')AS Date ,
Var.value
FROM table1 as Var
join table2 as team
on Var.code=team.code
---This last join with table3 is only there to add other columns that are not relevant to this problem.
---join table3 as detail_var on Var.variable=detail_var.code_var
我对之前的答案不满意,通过进一步阅读可以理解,OUTER APPLY。所以不得不做一些进一步的研究,这就是我想出的(现在是 Postgres 13)。
它更干净,并且以更简洁的方式完成工作。我还添加了一个 FIDDLE LINK
。如果您想查看以前的答案,请查看编辑版本。
SELECT
team.Team
,var.Variable
,var.Date
,var.value
,CASE
WHEN var.Variable='ad' THEN
(SELECT sum(value) FROM table1
WHERE
(TO_DATE(Year||'-'||LPAD(Month::varchar(2),2,'0')||'-'||'01','YYYY-MM-DD')
BETWEEN (var.Date - INTERVAL '2 month') AND var.Date)
AND Variable = 'aa'
AND code = var.code)
ELSE null
END as past2monthsValue
FROM (
-- this sub query to change Year & Month to Date Type Value
-- this Date Type Value (Date) will be used to compare dates
-- (var.Date) in the above sub-query
SELECT
code,
Variable,
TO_DATE(Year||'-'||LPAD(Month::varchar(2),2,'0')||'-'||'01','YYYY-MM-DD') AS Date,
value
FROM table1
) var
JOIN table2 AS team ON var.code=team.code