Intereting Posts
База данных Oracle допускает недопустимую временную часть значений столбца datetime при каких обстоятельствах? Обновить таблицу с подзапросом, который возвращает более одной строки Как найти сумму столбца между заданным диапазоном дат, где таблица имеет только дату начала и дату окончания Sybase: HAVING работает на строках? Создайте SQL-запрос для всех разрешенных продуктов в базе данных magento Возвращает номер из инструкции Oracle Select после даты синтаксического анализа Улучшение запроса с использованием большого количества внутренних соединений для wp_postmeta, таблицы ключей / значений Санизировать ввод пользователя с помощью ключевого слова USING в PL / pgSQL Удаление дублирования в динамическом ROW_NUMBER () OVER ORDER BY statement Легкая база данных SQL, которая не требует установки Разница между отношениями один к многим и многим к одному Лучшая практика SQL для работы с порядком сортировки по умолчанию Как создать таблицу из результатов SQL-запроса? Дополнительные объекты базы данных Простой запрос DB2 для проверки соединения

sql-запрос получает все данные от Jan до текущего месяца, даже если нет записей

Я плохо разбираюсь в sql, поэтому любой мир помощи будет отличным

У меня есть SQL-запрос, который получает записи, которые регистрируются с января до текущего месяца

Мой пример кода

SELECT DatePart(YEAR, p.createStamp) as TheYear, DatePart(MONTH, p.createStamp) as TheMonth , COUNT(p.pId) AS TOTALCOUNT FROM profile p with(nolock) where DatePart(YEAR, p.createStamp) = DATEPART(YEAR, GETDATE()) GROUP BY YEAR(p.createStamp), MONTH(p.createStamp) ORDER BY YEAR(p.createStamp), MONTH(p.createStamp) 

как всегда запрос вернет

Февраль = 2, март = 3, апрель = 4 и май = 5

я бы хотел, чтобы он возвращал Jan = 1 с общим количеством 0 и июня = 6 с общим количеством 0, а также любыми идеями, как это сделать?

Спасибо.

Вот цикл для создания комбинаций месяц / год и использовать его в качестве основы для вашего запроса:

 declare @startDate as datetime set @startDate = '1/1/13' declare @currentDate as datetime set @currentDate = '6/6/13' select month(@currentDate) as monthOfDate ,year(@currentDate) as yearOfDate into #allDates where 1=0 while (@startDate <= @currentDate) begin insert into #allDates values (month(@startDate),year(@startDate)) set @startDate = dateadd(m,1,@startDate) end select _monthYear.yearofDate ,_monthYear.monthOfDate , COUNT(p.pId) as total from #allDates _monthYear left join profile p with(nolock) on month(p.createStamp) = _monthYear.monthOfDate and year(p.createStamp) = _monthYear.yearOfDate group by _monthYear.yearofDate ,_monthYear.montOfDate drop table #allDates 

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

 CREATE TABLE #Months (Year_ INT, Month_ INT) GO SET NOCOUNT ON DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=20) BEGIN --Do Stuff INSERT INTO #Months SELECT YEAR(DATEADD(MONTH,@intflag,'20121201')),MONTH(DATEADD(MONTH,@intflag,'20121201')) SET @intFlag = @intFlag + 1 END GO 

Вы можете изменить «20» на любое количество месяцев, которое вы хотите, и изменить «20121201» в обоих точках на месяц до месяца, который вы хотите начать искать.

Затем, присоединившись к этому столу, я считаю, что следующее будет работать:

 SELECT m.Year_ as TheYear, m.Month_ as TheMonth , ISNULL(COUNT(p.pId),0) AS TOTALCOUNT FROM profile p RIGHT JOIN #Months m ON DatePart(YEAR, p.createStamp) = m.Year_ AND DatePart(MONTH, p.createStamp) = m.Month_ where DatePart(YEAR, p.createStamp) = DATEPART(YEAR, GETDATE()) GROUP BY m.Year_, m.Month_ ORDER BY m.Year_, m.Month_