Извлечение текущих итогов из двух отдельных таблиц

#sql #sql-server #sql-server-2012 #sql-server-2008-r2

#sql #sql-сервер #sql-server-2012 #sql-server-2008-r2

Вопрос:

Я пытаюсь выполнить текущий итоговый запрос на основе двух таблиц, и я немного в тупике. Вот что у меня есть на данный момент. Во-первых, позвольте мне предоставить вам, ребята, DDL таблицы и примеры данных, которые я использую. Таблица 1

 create table Actuals
(
f_year varchar(02),
f_period varchar(02),
f_fund varchar(06),
f_org varchar(06),
f_pror varchar(06),
f_trans_amt decimal

);
 

Таблица 2

 create table Actuals
(
f_year varchar(02),
f_period varchar(02),
f_fund varchar(06),
f_org varchar(06),
f_pror varchar(06),
f_trans_amt decimal

);

    GO
    SET ANSI_PADDING OFF
    GO
    INSERT [dbo].[Actuals] ([f_year], [f_period], [f_fund], [f_org], [f_pror], [f_trans_amt]) VALUES (N'07', N'01', N'aaa', N'bbb', N'ccc', CAST(20 AS Decimal(18, 0)))
    GO
    INSERT [dbo].[Actuals] ([f_year], [f_period], [f_fund], [f_org], [f_pror], [f_trans_amt]) VALUES (N'07', N'02', N'aaa', N'bbb', N'ccc', CAST(30 AS Decimal(18, 0)))
    GO
    INSERT [dbo].[Actuals] ([f_year], [f_period], [f_fund], [f_org], [f_pror], [f_trans_amt]) VALUES (N'07', N'03', N'aaa', N'bbb', N'ccc', CAST(50 AS Decimal(18, 0)))
    GO
    INSERT [dbo].[Actuals] ([f_year], [f_period], [f_fund], [f_org], [f_pror], [f_trans_amt]) VALUES (N'07', N'04', N'aaa', N'bbb', N'ccc', CAST(150 AS Decimal(18, 0)))
    GO
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[budget] ([f_year], [f_period], [f_fund], [f_org], [f_pror], [f_trans_amt]) VALUES (N'07', N'03', N'aaa', N'bbb', N'ccc', CAST(150 AS Decimal(18, 0)))
GO
INSERT [dbo].[budget] ([f_year], [f_period], [f_fund], [f_org], [f_pror], [f_trans_amt]) VALUES (N'07', N'06', N'aaa', N'bbb', N'ccc', CAST(150 AS Decimal(18, 0)))
GO
 

Это мои текущие результаты с использованием следующего запроса.

 with cte_actuals(
totalActual,
f_year,
f_period,
f_fund,
f_org,
f_pror
)
 as (
select sum(f_trans_amt) over (partition by f_fund,f_org,f_pror order by f_period, f_year ) totalActual,
f_year,
f_period,
f_fund,
f_org,
f_pror
from Actuals),

cte_budget (
totalBudget,
f_year,
f_period,
f_fund,
f_org,
f_pror
)
 as (
select sum(f_trans_amt) over (partition by f_fund,f_org,f_pror order by f_period, f_year ) totalBudget,
f_year,
f_period,
f_fund,
f_org,
f_pror
from budget)
select  
b.totalBudget,
a.totalActual,
a.f_year,
a.f_period,
a.f_fund,
a.f_org,
a.f_pror
From
cte_actuals a
full outer join cte_budget b on( a.f_fund = b.f_fund
 and a.f_org = b.f_org
 and a.f_pror = b.f_pror
 and a.f_year = b.f_year
and a.f_period = b.f_period
and a.f_year = b.f_year); 
 

введите описание изображения здесь

Я пытаюсь получить эти результаты, но мне трудно концептуализировать решение.
введите описание изображения здесь

Моя конечная цель — объединить два текущих итога в один запрос, но таблицы не являются точным совпадением. Другими словами, не все f_period и f_year находятся в обеих таблицах, поэтому мне остается заполнить пробелы текущим итогом за последний период. На рисунке выше показан конечный результат того, чего я пытаюсь достичь.

Ответ №1:

пожалуйста, попробуйте это, сначала я объединил таблицы в cte, а затем вычислил текущий итог.

 ;with cte as(
select 
     Coalesce(a.f_year, b.f_year) as f_year
    ,coalesce(a.f_period, b.f_period) as f_period
    ,coalesce(a.f_fund, b.f_fund) as f_fund
    ,coalesce(a.f_org, b.f_org) as f_org
    ,coalesce(a.f_pror, b.f_pror) as f_pror
    , Coalesce(a.f_trans_amt, 0) as ActualAmount
    ,coalesce(b.f_trans_amt, 0) as BudgetAmount
 from Actuals as a
 full outer join Budget as b on 
( a.f_fund = b.f_fund
 and a.f_org = b.f_org
 and a.f_pror = b.f_pror
 and a.f_year = b.f_year
and a.f_period = b.f_period
and a.f_year = b.f_year)
) select *
,sum(ActualAmount) over (partition by f_fund,f_org,f_pror order by f_period, f_year ) as ActualAmount
,sum(BudgetAmount) over (partition by f_fund,f_org,f_pror order by f_period, f_year ) as BudgetAmount

 from cte
 

Комментарии:

1. Ты, мой друг, гений! Спасибо за элегантное решение. Я действительно застрял там на некоторое время. Я, конечно, благодарен.