当月

2013-03-19 86 views
1

时只查询数据我有如下一个简单的SQL查询:当月

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

这给了我选择的数据如下:

enter image description here

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

理想情况下,这将改变为我前进的一个新月。

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

enter image description here

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

+0

你的数据的第一个图像甚至没有在第二图像匹配所需的结果。你能澄清你想要做什么吗?请使用您的表格结构,样本数据和期望的结果以及您当前使用的任何查询来编辑问题。 – Taryn 2013-03-19 17:13:11

+0

对不起,我已经更新了整个问题,试图让它更清晰地表明我正在尝试做什么 – user1086159 2013-03-19 17:50:02

回答

12

这将使用索引,而不像“技巧”将日期时间转换为字符串,然后返回日期,或对列使用DATEPART

WHERE TransactionDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) 
AND TransactionDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0); 

Tidier?

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/@我的变量,然后:

CurrentValue = CASE 
    WHEN TransactionDate >= @ms AND TransactionDate < @me 
    THEN TotalCost END 

还要注意的是TransactionDate不应该在你的分组列,如果你将要执行某种聚合。如果您向我们展示您实际需要的结果 - 我们可以编写您的整个查询 - 列表和分组您根本没有真正意义上的第一眼,所以根据您的实际问题,我模糊了这些以便我们可以专注于实际的WHERE条款。

+0

我已更新我的原始qst以包含我正在尝试实现的一个示例 – user1086159 2013-03-19 17:05:03

+0

@ user1086159对不起,我仍然不遵循你在做。输出与任何输入都不匹配,所以我不知道您是否正在汇总,如果您列出单个日期等,“当月”是什么意思。 – 2013-03-19 17:24:19

+0

对不起,我已将整个问题更新为试着让它更清晰我想要做的事 – user1086159 2013-03-19 17:49:27

0

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

WHERE DATEPART(month, GETDATE()) = DATEPART(month, Date)) 
AND (DATEPART(year, GETDATE()) = DATEPART(year, Date) 
+1

昂贵,不会使用索引。 – 2013-03-19 16:02:19

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