SQL-запрос для подсчета числа по месяцам - PullRequest
5 голосов
/ 24 мая 2011

Какой хороший способ объединить 1-12 в столбце с количеством отсчетов по месяцам? ... в SQL

SELECT
    months???,
    count(whatever1) count1,
    count(whatever2) count2
FROM
    months????
    LEFT JOIN whatever1 ON
        month(whatever1.Date) = months???.monthid
    LEFT JOIN whatever2 ON
        month(whatever2.Date) = months???.monthid
GROUP BY
    months???

что-то вроде

"month","whatever1count","whatever2count"
1,null,5
2,null,3
3,null,null
4,2,3
5,36,73
6,2,null
7,45,944
8,null,12
9,1467,3
10,null,2
11,3,25
12,4,null

edit - в основном, где отличный способ получить мой список месяцев / таблицу / что угодно

Ответы [ 2 ]

4 голосов
/ 25 мая 2011

в основном, где отличный способ получить мой список месяцев / таблицу / что угодно

Вы можете использовать рекурсивный cte для создания списка месяцев.

;with Months(MonthNum) as
(
  select 1 MonthNum
  union all
  select MonthNum+1
  from Months
  where MonthNum < 12 
)

-- Your query goes here
select * 
from Months
4 голосов
/ 24 мая 2011

Множество способов ... одним из подходов для меня во многих приложениях на предыдущей работе было создание таблицы временных рамок.

id - Year - Month   - StartStamp            - End Stamp  
1  - 2008 - January - 1/1/2008 00:00:00.000 - 1/31/2008 23:59:59.999

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

Это облегчает получение определенного периода времени или всех периодов времени ...

Ваша может быть проще, всего 12 записей (т.е. 1 января) и присоединение к DATEPART (m, DateColumn)

select mon.monthNumber, mon.monthName, 
       count(a.*) as count1, count(b.*) as count2
from months mon
left join whatever1 a on DATEPART(m,a.Date) = mon.monthNumber
left join whatever2 b on DATEPART(m,b.Date) = mon.monthNumber
group by mon.monthNumber, mon.monthName

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

select mon.monthNumber, mon.monthName, 
       count(a.*) as count1, count(b.*) as count2
from (
   select 1 as monthNumber, 'January' as monthName
   union
   select 2 as monthNumber, 'February' as monthName
   union
   select 3 as monthNumber, 'March' as monthName
   union
   ......etc.....
) mon
left join whatever1 a on DATEPART(m,a.Date) = mon.monthNumber
left join whatever2 b on DATEPART(m,b.Date) = mon.monthNumber
group by mon.monthNumber, mon.monthName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...