[英]Exclude a group if condition of another column isn't met
這是我正在處理的一個簡化示例。 我通過將不同的臨時表與存儲在數據庫中的表連接起來來創建臨時表 (a)。 我有臨時表(a)的以下輸出:
姓名 | 日期 | 美元 |
---|---|---|
一個 | 2022-06-01 | 500 美元 |
一個 | 2022-05-01 | 250 美元 |
一個 | 2022-04-01 | 100 美元 |
一個 | 2022-03-01 | 475 美元 |
乙 | 2022-06-01 | 180 美元 |
乙 | 2022-05-01 | 30 美元 |
乙 | 2022-04-01 | 360 美元 |
... | ... | ... |
我的最終目標是匯總“美元”並按“名稱”分組。 但是,如果該組的最早記錄日期距今天日期超過 3 個月,我只希望我的最終輸出包含“名稱”。 因此,在上述情況下,我想包括“A”並將“美元”加在一起,但我想排除 B,因為它不符合我的條件。 我怎樣才能做到這一點?
這就是我想要的最終輸出;
姓名 | 日期 | 美元 |
---|---|---|
一個 | 2022-06-01 | 1375 美元 |
... | 2022-06-01 | ... |
您可以像這樣使用案例說明
SELECT
case
when min(dt) <= dateadd(month,-3,getdate()) then (select name FROM example where name = e.name group by name)
else null
end as name,
max(dt),
case
when min(dt) <= dateadd(month,-3,getdate()) then (select sum(dollars) FROM example where name = e.name group by name)
else null
end as dollars
from
example e
group by
name
create table #temp1
(
name char(1),
date datetime,
dollars int
);
insert into #temp1 (name,date,dollars) select 'A','06/01/2022',500
insert into #temp1 (name,date,dollars) select 'A','05/01/2022',250
insert into #temp1 (name,date,dollars) select 'A','04/01/2022',100
insert into #temp1 (name,date,dollars) select 'A','03/01/2022',475
insert into #temp1 (name,date,dollars) select 'B','06/01/2022',180
insert into #temp1 (name,date,dollars) select 'B','05/01/2022',30
insert into #temp1 (name,date,dollars) select 'B','04/01/2022',360
with cte
as
(
select name,min(date) as date1,GETDATE() as date2,sum(dollars) as dollars
from #temp1
group by name
having min(date)<DATEADD(month,-3,getdate()))
select name,date2 as date,dollars
from cte
這能行嗎?
您希望報告所有月份的每月總計,但僅針對那些數據可追溯到三個月以上的名稱。
with data as (
<your main data here>
), aggregated as (
select name, max(date) as date, sum(dollars) as dollars,
min(max(date)) over (partition by name) as first_date,
count(*) over (partition by name) as month_count
from data
group by name
)
select name, date, dollars, first_date, month_count
from aggregated
where first_date < dateadd(month, -3, getdate());
或者
with data as (
<your main data here>
)
select name, max(date) as date, sum(dollars) as dollars
from data d1
where exists (
select 1 from data d2
where d2.name = d1.name and d2.date < dateadd(month, -3, getdate())
)
group by name;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.