2017-01-24 38 views
0

我想比較來自上一年和當前年份參數的數據。我創建了三個名爲#currentyear,#previous_year#comparison_over_previous_year的臨時表。在SQL Server中從兩個不同的臨時表中減去兩列

#currentyear數據正在從存儲過程中提取,我也想從存儲過程中提取前一年的數據。當嘗試在執行存儲過程時傳遞DATEADD函數時,T-SQL不喜歡它。現在,我在那裏傳遞了一個靜態數據。

我想從#currentyear臨時表和#previous_year臨時表中減去貨幣字段,但我有一段艱難的時間。

到目前爲止我的代碼是下面:

IF OBJECT_ID('tempdb..#currentyear') IS NOT NULL 
    DROP TABLE #currentyear 

IF OBJECT_ID('tempdb..#previousyear') IS NOT NULL 
    DROP TABLE #previousyear 

IF OBJECT_ID('tempdb..#comparison_over_previous_year') IS NOT NULL 
    DROP TABLE #comparison_over_previous_year 

CREATE TABLE #currentyear 
(
    [Date] DATE, 
    [Carrier] VARCHAR(100), 
    [Direct Ceded Written Premium] MONEY, 
    [begofmonth] DATE 
) 

CREATE TABLE #previousyear 
(
    [Date] DATE, 
    [Carrier] VARCHAR(100), 
    [Direct Ceded Written Premium] MONEY, 
    [begofmonth] DATE 
) 

CREATE TABLE #comparison_over_previous_year 
(
    [Date] DATE, 
    [Carrier] VARCHAR(100), 
    [Direct Ceded Written Premium] MONEY, 
    [begofmonth] DATE 
) 

INSERT INTO #currentyear 
    EXECUTE [dbo].[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518] 
        @StartDate = '20160101', @EndDate = '20161130', 
        @ResEQCarrierCd = 'Palomar' 

INSERT INTO #previousyear 
    EXECUTE [dbo].[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518] 
      --DATEADD(YEAR,-1,@StartDate) = '20160101' 
      --DATEADD(YEAR,-1,@EndDate) = '20161130' 
      @StartDate = '20150101', **--Using this static value from now as the script above is not playing nice** 
      @EndDate = '20151130', @ResEQCarrierCd = 'Palomar' 

INSERT INTO #comparison_over_previous_year 
    SELECT 
     cy.[Date], cy.[Carrier], 
     cy.[Direct Ceded Written Premium] - py.[Direct Ceded Written Premium], 
     cy.[begofmonth] 
    FROM 
     #currentyear cy 
    JOIN 
     #previousyear py ON py.[Carrier] = cy.[Carrier] 

----Selects the data in order to dump into SSRS 
SELECT * 
FROM #comparison_over_previous_year 

SO我這裏有兩個問題:

  • 之一是DATEADD功能無法通過EXEC聲明傳遞

  • 和二是我一直試圖從減去[Direct Ceded Written Premium]列的值10和#previous_year表。看起來我需要按承運人和乞討月份分組。去年可能沒有每個月的所有運營商。例如,2015年januray月份可能沒有palomar作爲運營商,但2016年1月份會。所以他們不需要被減去。如果palomar在兩年內都存在,那麼它將被減去。希望這是有道理的。

2016 DATA 2016 DATA

這裏是我想在SSRS輸出結果,當我導出到Excel:

Output

+0

這是兩個問題。選擇一個這個職位,編輯相應的職位 - 選擇另一個職位。這些感覺好像也可能是重複的,所以請確保您檢查並確認這些問題尚未得到解答。 –

+0

它看起來像你不正確地使用DATEADD作爲參數。你會想要像'@StartDate = DATEADD(YEAR,-1,'20160101')'一樣使用它。 – Jerrad

+0

@danfield沒有重複。我從其他存儲過程中獲得的數據集爲我提供了今年想要的內容。我希望從這個select語句變成存儲過程,就是將一列字段減去另一列字段。 – Lisbon

回答

0

變量爲什麼不直接使用一個靜態變量在你的代碼,並設置它,你需要它嗎?

IF OBJECT_ID('tempdb..#currentyear') IS NOT NULL 
    DROP TABLE #currentyear 

IF OBJECT_ID('tempdb..#previousyear') IS NOT NULL 
    DROP TABLE #previousyear 

IF OBJECT_ID('tempdb..#comparison_over_previous_year') IS NOT NULL 
    DROP TABLE #comparison_over_previous_year 

CREATE TABLE #currentyear 
(
    [Date] DATE, 
    [Carrier] VARCHAR(100), 
    [Direct Ceded Written Premium] MONEY, 
    [begofmonth] DATE 
) 

CREATE TABLE #previousyear 
(
    [Date] DATE, 
    [Carrier] VARCHAR(100), 
    [Direct Ceded Written Premium] MONEY, 
    [begofmonth] DATE 
) 

CREATE TABLE #comparison_over_previous_year 
(
    [Date] DATE, 
    [Carrier] VARCHAR(100), 
    [Direct Ceded Written Premium] MONEY, 
    [begofmonth] DATE 
) 

DECLARE @start datetime, @end datetime 

--variables to hold dates in procs 
set @start = '20160101' 
set @end = '20161130' 

INSERT INTO #currentyear 
    EXECUTE [dbo].[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518] 
        @StartDate = @start, @EndDate = @end, 
        @ResEQCarrierCd = 'Palomar' 

--reset them to -1 year of themselves 
set @start = DATEADD(YEAR,-1,@start) 
set @end = DATEADD(YEAR,-1,@end) 

INSERT INTO #previousyear 
    EXECUTE [dbo].[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518] 

      @StartDate = @start, 
      @EndDate = @end 

INSERT INTO #comparison_over_previous_year 
    SELECT 
     cy.[Date], cy.[Carrier], 
     cy.[Direct Ceded Written Premium] - py.[Direct Ceded Written Premium], 
     cy.[begofmonth] 
    FROM 
     #currentyear cy 
    JOIN 
     #previousyear py ON py.[Carrier] = cy.[Carrier] 

----Selects the data in order to dump into SSRS 
SELECT * 
FROM #comparison_over_previous_y 

然而,您的減法,你所要完成依賴於只有1行對於每一日期,每個載波。在插入數據之前,你應該改變你的過程來聚合數據,但是在這裏我正在把它做到另一個臨時表中,所以你不必改變過程。

IF OBJECT_ID('tempdb..#currentyear') IS NOT NULL 
    DROP TABLE #currentyear 

IF OBJECT_ID('tempdb..#previousyear') IS NOT NULL 
    DROP TABLE #previousyear 

IF OBJECT_ID('tempdb..#currentyearAggregate') IS NOT NULL 
DROP TABLE #currentyearAggregate 

IF OBJECT_ID('tempdb..#previousyearAggregate') IS NOT NULL 
DROP TABLE #previousyearAggregate 

IF OBJECT_ID('tempdb..#comparison_over_previous_year') IS NOT NULL 
    DROP TABLE #comparison_over_previous_year 

CREATE TABLE #currentyear 
(
     [Date] DATE, 
     [Carrier] VARCHAR(100), 
     [Direct Ceded Written Premium] MONEY, 
     [begofmonth] DATE 
) 

--New Temp Table to hold Aggregated Data 
CREATE TABLE #currentyearAggregate 
(
     [Date] DATE, 
     [Carrier] VARCHAR(100), 
     [Direct Ceded Written Premium] MONEY, 
     [begofmonth] DATE 
) 

CREATE TABLE #previousyear 
(
     [Date] DATE, 
     [Carrier] VARCHAR(100), 
     [Direct Ceded Written Premium] MONEY, 
     [begofmonth] DATE 
) 

--New Temp Table to hold Aggregated Data 
CREATE TABLE #previousyearAggregate 
(
     [Date] DATE, 
     [Carrier] VARCHAR(100), 
     [Direct Ceded Written Premium] MONEY, 
     [begofmonth] DATE 
) 

CREATE TABLE #comparison_over_previous_year 
(
     [Date] DATE, 
     [Carrier] VARCHAR(100), 
     [Direct Ceded Written Premium] MONEY, 
     [begofmonth] DATE 
) 

DECLARE @start datetime, @end datetime 

--variables to hold dates in procs 
set @start = '20160101' 
set @end = '20161130' 

INSERT INTO #currentyear 
    EXECUTE [dbo].[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518] 
        @StartDate = @start, @EndDate = @end, 
        @ResEQCarrierCd = 'Palomar' 

--reset them to -1 year of themselves 
set @start = DATEADD(YEAR,-1,@start) 
set @end = DATEADD(YEAR,-1,@end) 

INSERT INTO #previousyear 
    EXECUTE [dbo].[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518] 
      @StartDate = @start, 
      @EndDate = @end 

--Sum up the premiums for each day 
INSERT INTO #previousyearAggregate 
    SELECT 
     [Date], 
     [Carrier], 
     SUM([Direct Ceded Written Premium]) as [Direct Ceded Written Premium], 
     [begofmonth] 
    FROM 
     #previousyear 
    GROUP BY 
     [Date], 
     [Carrier], 
     [begofmonth] 

--Sum up the premiums for each day 
INSERT INTO #currentyearAggregate 
    SELECT 
     [Date], 
     [Carrier], 
     SUM([Direct Ceded Written Premium]) as [Direct Ceded Written Premium], 
     [begofmonth] 
    FROM 
     #currentyear 
    GROUP BY 
     [Date], 
     [Carrier], 
     [begofmonth] 

INSERT INTO #comparison_over_previous_year 
    SELECT 
     cy.[Date], 
     cy.[Carrier], 
     cy.[Direct Ceded Written Premium] - py.[Direct Ceded Written Premium], 
     cy.[begofmonth] 
    FROM 
     #currentyearAggregate cy 
    JOIN 
     #previousyearAggregate py ON 
     py.[Carrier] = cy.[Carrier] 
     and py.[Date] = cy.[Date]    --Added this join condition 

--Selects the data in order to dump into SSRS 
SELECT * 
FROM #comparison_over_previous_year 
+0

這看起來好像是朝着正確的方向發展。請注意,我有一個說begofmonth的專欄?我創建了該列,以便按月收集所有內容而不是montha和day。這會讓分組更容易。一月份的SO可能會有四家承運商進行交易:Palomar,Palomar CA,Palomar WA和Palomar OR。但他們不可能從去年開始交易。所以我想減去每個運營商的價值,每個月。 – Lisbon

+0

@Libson然後只刪除#aggregate表中的SELECT和GROUP BY中的[DATE]列,並將上一次select中的JOIN更改爲[begofmonth]而不是[date] – scsimon

+0

這正是我所做的。 #aggregate表格顯示正確的數據,但#comparison_over_previous_year已經關閉了很多。我認爲選擇聚合的月份和年份會拋棄它,因爲我只從#currentyearAggregate表中選擇begofmonth。希望這是有道理的。 – Lisbon

0

DATEADD函數不能用作參數。你可以聲明這樣

Declare @ProcStartdate datetime = DATEADD(YEAR,-1,@startdate) 
Declare @ProcEnddate datetime = DATEADD(YEAR,-1,@Enddate) 

INSERT INTO #previousyear 
EXECUTE [dbo].[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518] 

@ProcStartdate 
,@ProcEnddate 
,@ResEQCarrierCd = 'Palomar' 
+0

由於atStartDate和atEndDate參數來自[dbo],因此它不起作用。[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518]錯誤如下: 消息137,級別15,狀態2,行1 必須聲明標量變量「atStartDate」。 消息137,級別15,狀態2,行48 必須聲明標量變量「atProcStartdate」。 – Lisbon

+0

atStartdate和atEnddate用作[dbo]的參數。[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518]。所以你以前的SP將這些值分配給atStartdate和atEnddate。這是你在之前的評論中告訴的 – Raja

+0

這是正確的。 atStartDate和atEndDate來自[dbo]。[rpt_written_premium_extract_CURRENT_YEAR_RPT-4518]所以如何執行這些參數?當我聲明一個像上面這樣的新參數時,它給了我一個錯誤,說我需要聲明標量變量atStartDate – Lisbon