我有一个简单的SQL查询,如下所示:
select ProjectNo,
CostCat,
SummaryCostCat,
CreditorEmployeeName,
UnitCost,
TotalCost,
TransactionDate
from dbo.NGPCostPosition
这为我提供了以下数据选择:
我想要做的是在我的数据中创建一个名为“CurrentValue”的新列,该列将根据当月的交易日期计算每个TotalCost值。
理想情况下,这会随着我进入新的月份而改变。
这方面的一个例子如下图所示: -
其中CurrentValue代表当月数据。
答案 0 :(得分:12)
这将使用索引,与“技巧”不同,将日期时间转换为字符串,然后重新定义,或者使用DATEPART
对齐列。
WHERE TransactionDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
AND TransactionDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0);
整洁?
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;
随着需求的不断变化,如何使用上面显示的@ms / @ me变量,然后:
CurrentValue = CASE
WHEN TransactionDate >= @ms AND TransactionDate < @me
THEN TotalCost END
另请注意,如果要执行某种聚合,TransactionDate
不应位于分组列中。如果您向我们展示您真正想要的结果,我们可以编写您的整个查询 - 您在第一眼看到的列列表和分组并没有真正有意义,因此根据您的实际问题我模糊了那些因此我们可以专注于实际{ {1}}条款。
答案 1 :(得分:0)
您可以使用DATEPART功能检查月份和年份:
WHERE DATEPART(month, GETDATE()) = DATEPART(month, Date))
AND (DATEPART(year, GETDATE()) = DATEPART(year, Date)
答案 2 :(得分:0)
select ProjectNo,
CostCat,
SummaryCostCat,
CreditorEmployeeName,
UnitCost,
TotalCost,
TransactionDate,
CASE WHEN DATEPART(month, TransactionDate) = DATEPART(month, GETDATE()) AND
DATEPART(year, TransactionDate) = DATEPART(year, GETDATE()) THEN
TotalCost
ELSE NULL
END AS CurrentValue
from dbo.NGPCostPosition