从 SQL 服务器中的两个不同临时表中减去两列
Subtracting two columns from two different temp tables in SQL Server
我正在尝试比较上一年和今年参数的数据。我创建了三个名为 #currentyear
、#previous_year
和 #comparison_over_previous_year
.
的临时 table
#currentyear
数据是从存储过程中提取的,我也想从存储过程中提取前一年的数据。在执行存储过程时尝试传递 DATEADD
函数时,T-SQL 不喜欢它。现在,我在那里传递了一个静态数据。
我想从 #currentyear
temp table 和 #previous_year
temp table 中减去 Money 字段,但我遇到了困难。
到目前为止我的代码如下:
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
所以我这里有两个问题:
一个是DATEADD
函数不能通过EXEC
语句
还有两个是我一直在尝试从 #currentyear
和 #previous_year
table 中减去 [Direct Ceded Written Premium]
列的值。看起来我需要按运营商和 begofmonth 分组。去年可能没有每个月的所有运营商。例如,2015 年 1 月可能没有 palomar 作为载体,但 2016 年 1 月会有。所以他们不必被减去。如果 palomar 在这两年都存在,那么它将被减去。希望这是有道理的。
这里是当我将它导出到 excel 时我想在 SSRS 中输出的结果:
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'
为什么不在代码中使用静态变量并将其设置在需要的位置?
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 行。您应该在插入数据之前更改您的程序以聚合数据,但在这里我将其转换为另一个临时文件 table,因此您不必更改程序。
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
我正在尝试比较上一年和今年参数的数据。我创建了三个名为 #currentyear
、#previous_year
和 #comparison_over_previous_year
.
#currentyear
数据是从存储过程中提取的,我也想从存储过程中提取前一年的数据。在执行存储过程时尝试传递 DATEADD
函数时,T-SQL 不喜欢它。现在,我在那里传递了一个静态数据。
我想从 #currentyear
temp table 和 #previous_year
temp table 中减去 Money 字段,但我遇到了困难。
到目前为止我的代码如下:
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
所以我这里有两个问题:
一个是
DATEADD
函数不能通过EXEC
语句还有两个是我一直在尝试从
#currentyear
和#previous_year
table 中减去[Direct Ceded Written Premium]
列的值。看起来我需要按运营商和 begofmonth 分组。去年可能没有每个月的所有运营商。例如,2015 年 1 月可能没有 palomar 作为载体,但 2016 年 1 月会有。所以他们不必被减去。如果 palomar 在这两年都存在,那么它将被减去。希望这是有道理的。
这里是当我将它导出到 excel 时我想在 SSRS 中输出的结果:
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'
为什么不在代码中使用静态变量并将其设置在需要的位置?
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 行。您应该在插入数据之前更改您的程序以聚合数据,但在这里我将其转换为另一个临时文件 table,因此您不必更改程序。
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