1

我有一个简单的 SQL 查询,如下所示:

select   ProjectNo,
         CostCat,
         SummaryCostCat,
         CreditorEmployeeName,
         UnitCost,
         TotalCost,
         TransactionDate
from dbo.NGPCostPosition

这为我提供了如下数据选择:

在此处输入图像描述

我想做的是在我的数据中创建一个名为“CurrentValue”的新列,该列将根据当前月份的交易日期计算每个 TotalCost 值。

理想情况下,这会随着我进入新的一个月而改变。

这方面的一个例子是下图: -

在此处输入图像描述

其中 CurrentValue 表示当前月份的数字。

4

3 回答 3

13

这将使用索引,与“技巧”不同,将日期时间转换为字符串然后返回日期,或者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如果您要执行某种聚合,则不应在您的分组列中。如果您向我们展示您真正想要的结果,我们可以编写您的整个查询 - 乍一看您的列列表和分组并没有真正意义,因此根据您的实际问题,我掩盖了这些,以便我们可以专注于实际WHERE条款.

于 2013-03-19T16:00:48.667 回答
0

您可以使用 DATEPART 函数检查月份和年份:

WHERE DATEPART(month, GETDATE()) = DATEPART(month, Date)) 
AND (DATEPART(year, GETDATE()) = DATEPART(year, Date)
于 2013-03-19T16:01:55.620 回答
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
于 2013-03-19T22:39:50.063 回答