合并多个 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
我找不到有效的解决方案来解决我的问题。我认为这是一个相当普遍的问题,这就是我在这里提出这个问题的原因。
问题来了。
假设我有多个选择,例如以下几个:
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