2013-03-19 8 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

+0

Извините, я обновил весь вопрос, чтобы попытаться сделать его более ясным для того, что я пытаюсь сделать. – user1086159

ответ

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; 

С постоянно меняющихся требований, как об использовании @ мс/@ мне переменных, приведенных выше, а затем:

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

Также обратите внимание, что TransactionDate не должно быть в вашей колонке группировки, если вам собираются выполнить какой-то агрегат. Мы можем написать весь ваш запрос, если вы покажете нам, какой результат вы действительно хотите - список столбцов и группировка, которые вы на самом деле не имели на первый взгляд, поэтому, основываясь на вашем фактическом вопросе, я скрыл их, поэтому мы можем сосредоточиться на фактическом WHERE пункт.

+0

Я обновил свой оригинальный qst, чтобы включить пример того, чего я пытаюсь достичь. – user1086159

+0

@ user1086159 Извините, я до сих пор не понимаю, что ты делаешь. Выход не соответствует ни одному из входных данных, поэтому я не знаю, агрегируетесь или нет, что вы подразумеваете под «текущим месяцем», если вы указываете отдельные дни и т. Д. –

+0

Извините, я обновил весь вопрос до попробуйте и уточните, для чего я пытаюсь сделать – user1086159

0

Вы можете использовать функцию DATEPART проверить месяц и год:

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

Дорого, не будем использовать индекс. –

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 
Смежные вопросы