嗨,我对SQL报道很陌生,但我有一个看似很难的问题(至少我认为是这样;-)让我们希望有人可以证明我错了!) 我正在创建一个“年初至今”的报告,其中包含12个月的移动平均值。这要求我查询最多23个月前的所有可用结果(因为我的报告中的oldes值是12个月前)。 我现在解决它的方式(有效)是制作24个数据集,每个数据集在一个月前查询。所以本月ds1:查询,上个月ds2:查询... ds24:23个月前查询。
问题是:有没有办法在单个查询中组合它?
表格如下:
DATE ID VALUE DESCRIPTION
1/1/2012 12 'Text here' 'Text here'
(简化,有一些ineer连接和一些更多参数)查询如下:
SELECT COUNT Date, ID, Value, Description
FROM Table
WHERE (Date BETWEEN @parFrom AND DATEADD(month, 1, @parFrom))
AND description = 'Text here'
我需要这个的原因是因为当你没有包含所有可用值的数据集时,显然不可能制作图表。
希望有人可以提供帮助:)
答案 0 :(得分:0)
我认为您正在寻找将您的所有表格合并为一个表格。 query.AM我是对的。如果是的话。
例如,可以通过联合查询来组合多个查询的结果。这是一个查询。
SELECT colA, colB FROM tableA WHERE colA > 1
UNION
SELECT colX, colA FROM tableB WHERE colA > 1
这里有一些样本可以帮到你。
http://msdn.microsoft.com/en-us/library/ms180026%28v=sql.90%29.aspx
答案 1 :(得分:0)
我喜欢在这样的查询中使用Common Table Expressions作为日期。根据你的源表,这可能不是最简单的答案,但它很好地用于所有目的:
CREATE TABLE #Events
(id INT IDENTITY,
EventTypeID INT,
EventDate DATETIME)
INSERT INTO #Events
( EventTypeID, EventDate )
VALUES
( 32, '2012-1-1' ),
( 4, '2012-1-1' ),
( 5, '2012-2-3' ),
( 4, '2012-2-25' ),
( 34, '2012-3-1' ),
( 4, '2012-4-3' ),
( 4, '2012-4-16' )
;
WITH MonthsCTE
AS ( SELECT
1 AS ID ,
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AS MonthStart ,
DATEADD(YEAR, -1,
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) AS YearEarlier
UNION ALL
SELECT
ID + 1 ,
DATEADD(MONTH, -1, MonthStart) ,
DATEADD(YEAR, -1, DATEADD(MONTH, -1, MonthStart))
FROM
MonthsCTE
WHERE
DATEADD(MONTH, -1, MonthStart) > DATEADD(YEAR, -1, GETDATE())
)
SELECT
MonthStart ,
COUNT(#Events.EventTypeID) AS TotalOccurances,
COUNT(#Events.EventTypeID) /12 AS AverageOccurances
FROM
MonthsCTE
LEFT OUTER JOIN #Events
ON #Events.EventDate BETWEEN YearEarlier AND MonthStart
AND #Events.EventTypeID = 4
GROUP BY
MonthStart
DROP TABLE #Events
上面,我正在建立一个CTE(如果您不熟悉它们,请考虑临时表),包括过去十二个月和一年前的日期。
然后第二个查询将该表连接到您的数据,允许任何数据落在CTE中的字段之间。