2016-07-25 6 views
0

Хотелось бы сосчитать. Не уверен, могу ли я использовать функцию count или использовать оператор case.Кол-во записей за месяц

Хочу рассчитывать идентификатор, но рассчитывать, что идентификатор на каждый месяц, если EndDate_YYYYMM> = StartDate_YYYYMM

Для примера:

ID StartDate_YYYYMM EndDate_YYYYMM 
1  201601    201606 

желаемых результатов: "занято"

StartDate_YYYYMM  Count 
    201601     1 
    201602     1 
    201603     1 
    201604     1 
    201605     1 
    201606     1 
    201607 

ответ

2

Это не так просто, как вы, наверное, ожидаете. В основном это связано с несколькими вопросами, связанными с вашим вопросом:

  • Ваша структура таблицы неизвестна (в следующий раз добавьте DDL).
  • Мы должны предположить, что ваши даты хранятся в виде VARCHAR из-за формат YYYYMM.
  • Производить последовательность дат легче всего достигается с помощью таблицы «Даты», мы должны предположить, что вы не один.

Это, как говорится, следующий запрос будет производить результаты, которые вы стремитесь, учитывая мое понимание правильно:

; 
WITH CTE_DateTable 
      AS (
       SELECT #t.ID, 
         CAST(#t.StartDate_YYYYMM + '01' AS DATE) AS StartDate, 
         CAST(#t.EndDate_YYYYMM + '01' AS DATE) AS EndDate 
       FROM  #t 
      ), 
     CTE_MinMaxDates 
      AS (
       SELECT MIN(CTE_DateTable.StartDate) AS MinDate, 
         MAX(CTE_DateTable.EndDate) AS MaxDate, 
         DATEDIFF(MONTH, MIN(CTE_DateTable.StartDate), MAX(CTE_DateTable.EndDate)) AS Difference 
       FROM  CTE_DateTable 
      ), 
     CTE_Nums 
      AS (
       SELECT ROW_NUMBER() OVER (ORDER BY ob.object_id) AS Num 
       FROM  sys.all_objects AS ob 
      ), 
     CTE_Months 
      AS (
       SELECT DATEADD(MONTH, n.Num - 1, d.MinDate) AS MonthStart 
       FROM  CTE_MinMaxDates d 
       CROSS JOIN CTE_Nums n 
       WHERE  DATEADD(MONTH, n.Num - 1, d.MinDate) <= d.MaxDate 
      ) 
    SELECT CAST(DATEPART(YEAR, m.MonthStart) AS VARCHAR) + SUBSTRING(CONVERT(NVARCHAR(6), m.MonthStart, 112), 5, 2) AS StartDate_YYYYMM, 
      COUNT(DISTINCT d.ID) AS Count 
    FROM CTE_DateTable AS d 
    INNER JOIN CTE_Months AS m ON m.MonthStart BETWEEN d.StartDate AND d.EndDate 
    GROUP BY m.MonthStart; 

Working example

0

Если я понял ваш вопрос правильно, то скрипт вы ищете:

SELECT tab.StartDate_YYYYMM 
     , COUNT(*) AS [Count] 
FROM YourTable tab 
WHERE EndDate_YYYYMM >= StartDate_YYYYMM 
GROUP BY tab.id 
     , tab.StartDate_YYYYMM 
Смежные вопросы