使用 CTE 和 Pivot 从查询插入 Table

Insert into Table from Query with CTE and Pivot

我有一个查询 return 生成一个数据透视格式,我想将其插入 SQL table。 最终我将创建一个代理作业,它每晚 10 点运行并将记录插入 table。 我可以找到人们使用 CTE 的示例,然后将 CTE 的结果放入 table,但随着我对结果进行调整,我会更加复杂。

谁能帮帮我?

下面是脚本

WITH CTE as 

(SELECT

org.StudioMain,
BUD.ForecastProbability as 'Prob%',
(BUD.ForecastProbability*BUD.AmountOrgCurrency) as ForecastAmountOrg,
(BUD.ForecastProbability*CASE
WHEN org.EntityCode = 'WAU' AND org.Studio = 'Sydney' THEN 
BUD.AmountOrgCurrency/NULLIF(bud.ForecastCurrencyToNZDfx,0)
WHEN org.EntityCode = 'WAU' AND org.Studio = 'Melbourne' THEN 
BUD.AmountOrgCurrency/NULLIF(bud.ForecastCurrencyToNZDfx,0)
else BUD.AmountOrgCurrency
end) as ForecastAmountNZD


FROM EDWH.dbo.FactBudgets AS BUD
INNER JOIN [ODS].[dbo].[PeriodTriggerMain] as T ON BUD.BudgetName = T.BudgetName
LEFT JOIN EDWH.dbo.DimOrg as Org on BUD.DimOrgKey = org.DimOrgKey
LEFT JOIN ODS.dbo.DimFinPeriodDate as Period on BUD.DimFinPeriodDateKey = Period.DimFinPeriodDateKey
LEFT JOIN (SELECT DISTINCT WBS1, ProjectName, Principal, Sector FROM EDWH.dbo.DimProject where WBS2 = 
'') as PRN ON BUD.WBS1 = PRN.WBS1


WHERE 
CONVERT(varchar(10),dateadd(day,0,dateadd(month,datediff(month,0,dateadd(month, 3, 
datefromparts(left(BUD.FinPeriod, 4)-1, right(BUD.FinPeriod, 2), 1))),0)),120) BETWEEN
CONVERT(varchar(10),dateadd(day,0,dateadd(month,datediff(month,0,dateadd(month, 3, 
datefromparts(left(T.ForecastPeriod, 4)-1, right(T.ForecastPeriod, 2), 1))),0)),120) AND
CONVERT(varchar(10),dateadd(day,0,dateadd(month,datediff(month,0,dateadd(month, 14, 
datefromparts(left(T.ForecastPeriod, 4)-1, right(T.ForecastPeriod, 2), 1))),0)),120) 
)
SELECT * FROM (
SELECT
StudioMain,
Currency = 'NZD',
SUM(ForecastAmountNZD) as AmountNZD,
getdate() as Timestamp

FROM CTE as f

GROUP BY
StudioMain
) as NZD

PIVOT(
SUM(AmountNZD)
FOR [StudioMain] IN  
([AKL], [CHC], [MEL], [QNT], [SYD], [WEL], [WMT])
)
AS Pivot_Table

UNION ALL

SELECT * FROM (
SELECT
StudioMain,
Currency = 'ORG',
SUM(ForecastAmountOrg) as AmountOrg,
getdate() as Timestamp

FROM CTE as f

GROUP BY
StudioMain
) as Org

PIVOT(
SUM(AmountOrg)
FOR [StudioMain] IN
([AKL], [CHC], [MEL], [QNT], [SYD], [WEL], [WMT])
)
AS Pivot_Table

我想将结果插入到table;

根据你的问题我了解到,

  1. 您需要将基于 PIVOT 的 SQL 查询的执行结果插入 Table。所以我们将创建一个 table 包含下面的列,
  2. 货币、时间戳、AKL、CHC、MEL、QNT、SYD、WEL、WMT
  3. 然后您将创建一个 SQL 代理作业,您将在其中传递 SQL 查询以获取数据。
  4. 在源代码中,您需要提及查询中使用的 table 的数据库详细信息。
  5. 在 Destination 中,您需要提及要创建的新 table
  6. 将此作业安排在每天晚上 10 点运行
  7. 通过执行 Start Job at Step 来检查 Job,看看是否成功并且数据是否正在插入新的 table。

即使查询具有 PIVOT 功能,它也将是一个简单的 SQL 代理作业,将所需数据插入目标 table。

创建 CTE 查询的视图,然后将代理作业指向该视图。