use*_*159 1 sql t-sql ssms sql-server-2005
我有一个简单的SQL查询如下:
select ProjectNo,
CostCat,
SummaryCostCat,
CreditorEmployeeName,
UnitCost,
TotalCost,
TransactionDate
from dbo.NGPCostPosition
Run Code Online (Sandbox Code Playgroud)
这给了我一些数据如下:

我想要做的是在我的数据中创建一个名为"CurrentValue"的新列,该列将根据当前月份的交易日期计算每个TotalCost值.
理想情况下,这会随着我进入新的月份而改变.
这方面的一个例子如下图: -

其中CurrentValue代表当月数字.
Aar*_*and 12
这将使用索引,与"技巧"不同,将日期时间转换为字符串然后再转换为日期,或者使用DATEPART针对您的列.
WHERE TransactionDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
AND TransactionDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0);
Run Code Online (Sandbox Code Playgroud)
整洁的?
DECLARE @ms SMALLDATETIME, @me SMALLDATETIME;
SET @ms = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0);
SET @me = DATEADD(MONTH, 1, @ms);
SELECT
...
WHERE TransactionDate >= @ms AND TransactionDate < @me;
Run Code Online (Sandbox Code Playgroud)
随着需求的不断变化,如何使用上面显示的@ms/@ me变量,然后:
CurrentValue = CASE
WHEN TransactionDate >= @ms AND TransactionDate < @me
THEN TotalCost END
Run Code Online (Sandbox Code Playgroud)
另请注意,TransactionDate如果要执行某种聚合,则不应该在分组列中.如果您向我们展示您真正想要的结果,我们可以编写您的整个查询 - 您在第一眼看到的列列表和分组确实没有意义,因此根据您的实际问题我模糊了那些因此我们可以专注于实际WHERE条款.