合并多个 select 语句并将它们分组

Merge multiple select statements and group them

我找不到有效的解决方案来解决我的问题。我认为这是一个相当普遍的问题,这就是我在这里提出这个问题的原因。

问题来了。

假设我有多个选择,例如以下几个:

SELECT 创建

date num_created
01-01-2021 10
01-02-2021 2
01-04-2021 13
SELECT Update
date num_update
01-01-2021 14
01-02-2021 2
01-03-2021 9
SELECT Delete
date num_delete
01-02-2021 2
01-05-2021 40

我想要这个最终输出

Final output
date num_created num_update num_deleted
01-01-2021 10 14 0
01-02-2021 2 2 2
01-03-2021 0 9 0
01-04-2021 13 0 0
01-05-2021 0 0 40

*我不能假设任何 table 具有所有日期或具有匹配日期

您可以在表和case语句之间进行全外连接来选择日期,如下所示(假设3 tables/queries as a, b, c):

With temp as
    (
    select case when a.date is not null then a.date else b.date end as date,num_created,num_update from a full join b on (a.date=b.date)
    ),
    temp1 as
    (
    select case when temp.date is not null then temp.date else c.date end as date,num_created,num_update,num_delete from temp full join c on (temp.date=c.date)
    )
    select * from temp1;

假设 table 是:

tbl_create(dt, num_created) 
tbl_update(dt, num_updated)
tbl_delete(dt, num_deleted)

从(临时)table 开始,其中包含来自 3 个来源 table 的所有日期:all_dates

然后(左外)加入来自 3 个来源的计数器 tables。

注意:'union' 删除重复项,无需担心(与 'union all' 相反)

注意:coalesce(a,b) returns 第一个非空参数,所以你有零而不是 'null'

with all_dates(dt) as (
   select dt from tbl_create
   union
   select dt from tbl_update
   union
   select dt from tbl_delete
)
select all_dates.dt
     , coalesce(tbl_create.num_created,0)    --   
     , coalesce(tbl_update.num_updated,0)
     , coalesce(tbl_delete.num_deleted,0)
from all_dates 
  left outer join tbl_create on all_dates.dt = tbl_create.dt
  left outer join tbl_update on all_dates.dt = tbl_update.dt
  left outer join tbl_delete on all_dates.dt = tbl_delete.dt

您似乎希望按天数分组:

select
    tbls.date,
    sum(tbls.num_created) as num_created,
    sum(tbls.num_updated) as num_updated,
    sum(tbls.num_deleted) as num_deleted 
from (
    select date, num_created, 0 as num_updated, 0 as num_deleted from tbl_create
    union all
    select date, 0 as num_created, num_updated, 0 as num_deleted from tbl_update
    union all
    select date, 0 as num_created, 0 as num_updated, num_deleted from tbl_delete) as tbls
group by tbls.date

请不要在不需要时滥用“with 语句”(如其他答案所示)。

编辑 - 额外的简单查询:

    if object_id('tempdb..#tmp_dml_statement') is not null drop table #tmp_dml_statement 
    select date, num_created, 0 as num_updated, 0 as num_deleted
    into #tmp_dml_statement
    from tbl_create
    union all
    select date, 0 as num_created, num_updated, 0 as num_deleted
    from tbl_update
    union all
    select date, 0 as num_created, 0 as num_updated, num_deleted
    from tbl_delete