【发布时间】:2011-10-24 22:29:46
【问题描述】:
更新:我已经包含了可以粘贴到 SSRS 中的完整代码,以显示结果。
我们报告大量以日期为中心的信息,并且必须从中生成报告。一些源数据没有及时更新,但为了确保报告整洁并且可以共享相同的日期列,我们有时会在查询上方使用 CTE 来生成过去 13 个月的列表。一台服务器仍在使用 SQL Server 2000,因此无法使用 CTE。我尝试填充两个临时表并使用完全连接,但它似乎将其视为内部连接。以下是代表性查询:
set DATEFORMAT ymd
IF object_id('tempdb..#EXAMPLE_SOURCE_DATA') is not null
BEGIN
DROP TABLE #EXAMPLE_SOURCE_DATA
END
IF object_id('tempdb..#TEMP_STAGING') is not null
BEGIN
DROP TABLE #TEMP_STAGING
END
IF object_id('tempdb..#TEMP_LAST13MONTHS') is not null
BEGIN
DROP TABLE #TEMP_LAST13MONTHS
END
--This would normally be real data, but use a temporary for testing/bug fixing
CREATE TABLE #EXAMPLE_SOURCE_DATA(
Date datetime,
Actual float,
)
CREATE TABLE #TEMP_STAGING(
Date datetime,
Actual float,
)
CREATE TABLE #TEMP_LAST13MONTHS(
Date13 datetime,
)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-06-27 12:34:56', 56.56)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-05-23 12:34:56', 45.45)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-04-11 12:34:56', 23.23)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-03-03 12:34:56', 12.12)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-02-01 12:34:56', 12.12)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-01-23 12:34:56', 45.45)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-04-11 12:34:56', 23.23)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-03-03 12:34:56', 12.12)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-02-01 12:34:56', 67.67)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-01-05 12:34:56', 56.56)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2011-02-01 12:34:56', 67.67)
INSERT INTO #EXAMPLE_SOURCE_DATA VALUES ('2010-12-05 12:34:56', 78.78)
-- Copy data to a temp table but 'flatten' the Date into beginning of month, to allow comparison and join.
INSERT INTO #TEMP_STAGING (Date, Actual)
SELECT
CAST(CAST(DATEPART(Year,Date) AS varchar) + '-' + CAST(DATEPART(Month,Date) AS varchar) + CAST('-01 00:00:00' as varchar) AS datetime) AS Date,
Actual
FROM #EXAMPLE_SOURCE_DATA
--Insert rolling 13 months into a date table
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-1,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-2,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-3,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-4,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-5,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-6,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-7,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-8,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-9,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-10,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-11,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-12,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
INSERT INTO #TEMP_LAST13MONTHS VALUES (DATEADD(MONTH,-13,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)))
-- DEBUG
--/*
SELECT * FROM #TEMP_LAST13MONTHS ORDER BY Date13 DESC
SELECT * FROM #EXAMPLE_SOURCE_DATA ORDER BY Date DESC
SELECT * FROM #TEMP_STAGING ORDER BY Date DESC
--*/
--This doesn't return values against 2011-07-01 or before 2010-12-01 ??? (Date this
was written 2011-08)
SELECT
Date,
SUM(Actual)
FROM #TEMP_LAST13MONTHS
FULL OUTER JOIN #TEMP_STAGING ON #TEMP_LAST13MONTHS.Date13 = #TEMP_STAGING.Date
GROUP BY Date
ORDER BY Date DESC
【问题讨论】:
-
我们可以得到一些具有预期结果的样本数据吗?您当前拥有的预期结果显示 4 列,但您的临时表中只有 2 列和 1 列,并且在最终选择中仅选择 2 列,因此很难理解为什么您希望看到 4 行 7/ 1/2011,空,空,空
-
好的,我已经添加了临时表和最终输出的示例输出。这与 LEFT OUTER JOIN 相同,但对 RIGHT、FULL 等也是如此。
-
+1 提供可测试的脚本。
-
@Captian Bumble - 直到今天我才注意到你添加了一个可测试的脚本。为了将来参考,最好在您要求进一步信息的人的答案中添加评论。这样,系统就会通知该人。
-
@Caption Bumble - 我的答案已更改为包含您需要的查询(如果您仍然需要它)。
标签: sql-server join reporting-services temp-tables