簡體   English   中英

如果不滿足另一列的條件,則排除一個組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM