2016-07-22 2 views
-2

Как выбрать текущий счетчик строк таблицы до текущего месяца и объединить значения подсчета за последние 6 месяцев?Выберите count by datetime

Образец данных:

Id  CreatedTime  PersonId  MonthValue 
1  2015-03-01  1    100 
2  2015-03-15  5    200 
3  2015-04-19  7    400 
... 
... 
... 
980 2016-07-22  1349   100 

Желание группы количество строк в выходной, как:

Date  Total 
07/2016 331 
06/2016 277 
05/2016 145 
04/2016 100  
03/2016 69 
02/2016 57 
+3

вы можете показать схему таблицы, которую вы запрашиваете с некоторыми данными выборки, пожалуйста? – Tanner

+0

@Tanner Извините за отсутствие информации, я добавил его сейчас, но у меня есть правильный ответ от vercelli. – Drazen

ответ

1

Использование вспомогательной таблицы с датами:

;with dateaux as (select eomonth(GETDATE()) as d, -1 as lev union all 
       select eomonth(dateadd(month,lev,getdate())), lev-1 from dateaux where lev >-6) 
select format(d, 'MM/yyyy'), count(*) 
from dateaux join table1 t on dateaux.d >= t.mydate 
group by format(d, 'MM/yyyy') 

dateaux выход будет выглядеть следующим образом :

d   lev 
2016-07-31 -1 
2016-06-30 -2 
2016-05-31 -3 
2016-04-30 -4 
2016-03-31 -5 
2016-02-29 -6 
0

Вы можете использовать что-то вроде этого:

SELECT LEFT(CONVERT(nvarchar(10),[DateField],112),6) as [Date], 
     COUNT(*) as [Total] 
FROM YourTable 
WHERE DATEDIFF(month,[DateField],GETDATE()) < 6 
GROUP BY LEFT(CONVERT(nvarchar(10),[DateField],112),6) 
ORDER BY LEFT(CONVERT(nvarchar(10),[DateField],112),6) DESC 

На моих фиктивные данные с 12 месяцев я получаю:

Date Total 
201607 207 
201606 270 
201605 279 
201604 270 
201603 279 
201602 261 

Если вам нужно кумулятивный данные:

;WITH cte AS (
SELECT LEFT(CONVERT(nvarchar(10),[DateField],112),6) as [Date], 
     COUNT(*) as [Total] 
FROM YourTable 
WHERE DATEDIFF(month,[DateField],GETDATE()) < 6 
GROUP BY LEFT(CONVERT(nvarchar(10),[DateField],112),6) 
) 

SELECT c1.[Date], 
     SUM(c2.[Total]) as [Total] 
FROM cte c1 
INNER JOIN cte c2 
    ON c1.[Date] >= c2.[Date] 
GROUP BY c1.[Date], c1.[Total] 
ORDER BY c1.[Date] DESC 

Выход:

Date Total 
201607 1566 
201606 1359 
201605 1089 
201604 810 
201603 540 
201602 261 
+0

Этот запрос даст количество за месяц, но не кумулятивный – vercelli

+1

@vercelli, возможно, заявляет в вопросе, что вы хотите получить кумулятивный счет, иначе как мы должны знать? – Tanner

+0

@vercelli извините, думал, что вы OP, этот пункт направлен на OP, если это то, что ему нужно. – Tanner

0

Я предполагаю, что данные, которые вы показали, являются желаемым результатом и что у вас есть таблица с датами и значениями. Вот пример того, как можно достичь что-то похожее на ваш желаемый результат:

CREATE TABLE #Sales 
    (
     OrderDate DATETIME , 
     SaleValue DECIMAL(5, 2) 
    ) 

INSERT INTO #Sales (OrderDate , SaleValue) 
    SELECT '20160701' , 125.00 
    UNION ALL 
    SELECT '20160702' , 255.00 
    UNION ALL 
    SELECT '20160621' , 75.00 
    UNION ALL 
    SELECT '20160522' , 95.00 
    UNION ALL 
    SELECT '20160404' , 410.00 
    UNION ALL 
    SELECT '20160412' , 207.00 
    UNION ALL 
    SELECT '20160415' , 107.00 
    UNION ALL 
    SELECT '20160313' , 10.00 
    UNION ALL 
    SELECT '20160207' , 179.00 
    UNION ALL 
    SELECT '20160125' , 237.00 

SELECT YEAR(OrderDate) OrderYear , 
     MONTH(OrderDate) OrderMonth , 
     CAST(MONTH(OrderDate) AS VARCHAR(2)) + '/' 
     + CAST(YEAR(OrderDate) AS VARCHAR(4)) OrderDate , 
     COUNT(SaleValue) Total 
FROM #Sales 
WHERE YEAR(OrderDate) = YEAR(GETDATE()) 
     AND MONTH(OrderDate) >= MONTH(DATEADD(mm, -5, GETDATE())) 
GROUP BY YEAR(OrderDate) , 
     MONTH(OrderDate) 

DROP TABLE #Sales 

производит:

OrderYear OrderMonth OrderDate Total 
2016  2   2/2016  1 
2016  3   3/2016  1 
2016  4   4/2016  3 
2016  5   5/2016  1 
2016  6   6/2016  1 
2016  7   7/2016  2