ravikhoda Ответов: 3

как получить количество месяцев на основе года в sql-запросе?


Привет,
мне нужно создать запрос, в котором я передам year как int и получу все записи за все месяцы этого года.

так например если я войду в 2013 год то результат будет таким как показано ниже
month  count 
jan     10 
feb     0
mar     25
apr     15
may     15
jun     14
july    12
aug     0
sep     22
oct    15 
nov    26 
dec     0

я попробовал ниже запрос, который дает мне вывод, как показано ниже
jan     10 

mar     25
apr     15
may     15
jun     14
july    12

sep     22
oct    15 
nov    26 

вот мой вопрос.
select month(DepotArrivalDate), count(*)
from tbl_CMS_Container
WHERE     year(DepotArrivalDate) = '2013' 
group by month(DepotArrivalDate) 

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

3 Ответов

Рейтинг:
2

W∴ Balboos, GHB

Возможно, вы захотите создать таблицу со всеми ожидаемыми комбинациями месяц/год/количество, а затем обновить ее своими результатами. Вы, возможно, пожелает, чтобы инициализировать поле count в таблице ж/нули.

Другой вариант, более обобщенный, будет использовать один список Jan - Dec (1-12), и вы можете затем использовать левое соединение к вашему запросу, сопоставляя только числовые значения месяца: хорошо только для одного года за раз, но всегда хорошо.

При создании возврата, установленных с левой присоединиться, вы можете использовать функцию isnull(код-графа-столбец, 0) заменить значения NULL с недостающие месяцы с 0 по


Рейтинг:
0

NeverJustHere

Создайте табличную переменную с полным набором месяцев и заполните ее двенадцатью опциями.

Затем используйте левое соединение, чтобы получить то, что вы хотите.

Что-то вроде:

declare @Months table ( Month varchar(3))

insert into @Months values ('Jan'), ('Feb'), ('Mar'), .... 

select M.Month, count(*)
from @Months M
left join ....


phil.o

Я сменил тему. code тег к a pre тег, который больше подходит для многострочных кодовых блоков. Надеюсь ты не против :)

Рейтинг:
0

Member 14708330

Выберите [месяц],[количество] из (выберите
СУММА (СЛУЧАЙ, КОГДА ФУНКЦИЯ DATEPART (МЕСЯЦ,РУБЛЕЙ.Чекин) = 1 тогда 1 иначе 0 конец) 'января',
СУММА (СЛУЧАЙ, КОГДА ФУНКЦИЯ DATEPART (МЕСЯЦ,РУБЛЕЙ.Чекин) = 2 тогда 1 иначе 0 конец) 'февраля',
СУММА (СЛУЧАЙ, КОГДА ФУНКЦИЯ DATEPART (МЕСЯЦ,РУБЛЕЙ.Чекин) = 3 тогда 1 иначе 0 конец) 'марта',
SUM (CASE WHEN DATEPART (MONTH,RR.checkin) = 4 THEN 1 ELSE 0 END) 'Apr',
SUM (CASE WHEN DATEPART (MONTH,RR.checkin) = 5 THEN 1 ELSE 0 END) 'May',
SUM (CASE WHEN DATEPART (MONTH,RR.checkin) = 6 THEN 1 ELSE 0 END) 'Jun',
SUM (CASE WHEN DATEPART (MONTH,RR.checkin) = 7 THEN 1 ELSE 0 END) 'Jul',
SUM (CASE WHEN DATEPART (MONTH,RR.checkin) = 8 THEN 1 ELSE 0 END) 'Aug',
СУММА (СЛУЧАЙ, КОГДА ФУНКЦИЯ DATEPART (МЕСЯЦ,РУБЛЕЙ.Чекин) = 9 тогда 1 иначе 0 конец) 'сентября',
SUM (CASE WHEN DATEPART (MONTH,RR.checkin) = 10 THEN 1 ELSE 0 END) 'Oct',
SUM (CASE WHEN DATEPART (MONTH,RR.checkin) = 11 THEN 1 ELSE 0 END) 'Nov',
СУММА (СЛУЧАЙ, КОГДА ФУНКЦИЯ DATEPART (МЕСЯЦ,РУБЛЕЙ.Чекин) = 12 тогда 1 иначе 0 конец) 'декабря'

Из заказов RR с(NOLOCK)
Где год(RR.checkin)= 2020) tb1
оператор UNPIVOT (
считайте за [месяц] в (Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь)

) unpvt


CHill60

Я подозреваю, что вы были понижены в голосовании, потому что вопрос очень старый, и вы не отформатировали и не объяснили свое решение. Я частично противопоставил нисходящий голос, потому что это разумное элегантное решение и производит именно то, что хотел ОП (хотя и 5 лет назад)… впрочем, это можно было бы как-то объяснить. Лично я бы использовал более лаконичный вариант

select MM.[Month], MM.[text], ISNULL(COUNT(MONTH(RR.Checkin)), 0) as [count]
FROM (VALUES (1,'Jan'),(2,'Feb'),(3,'Mar'),(4,'Apr'),(5,'May'),(6,'Jun'),(7,'Jul'),(8,'Aug'),(9,'Sep'),(10,'Oct'),(11,'Nov'),(12,'Dec')) MM([Month], [text])
LEFT OUTER JOIN @Orders RR ON MM.[Month] = MONTH(RR.checkin) AND YEAR(RR.checkin)= 2019 
GROUP BY MM.[Month], MM.[text]
именно это и предлагало решение 2.
Может быть, лучше всего придерживаться ответов на более свежие сообщения