Доступ к SQL-запросу: группировка по месяцам, также если нет - PullRequest
0 голосов
/ 08 октября 2018

в моей таблице Table2 У меня есть некоторые суммы, упорядоченные по дате.Не все месяцы присутствуют.

Мне нужен запрос, который дает мне одну строку для каждого месяца года, поэтому 12 строк: январь, февраль и т. Д.

Для каждого месяца;Мне нужна сумма всех сумм за тот же месяц и результат за месяц.

Я пробовал использовать следующий код, который дает мне Table2 Query, но это не то, что мне нужно.Например, у нас есть только 6 месяцев вместо 12, и они не организованы в хронологическом порядке.

SELECT DISTINCTROW Format$([Table2].[Data],'mmmm yyyy') AS [Data By Month], Sum(Table2.Budget) AS [Sum Of Budget]
FROM Table2
GROUP BY Format$([Table2].[Data],'mmmm yyyy'), Year([Table2].[Data])*12+DatePart('m',[Table2].[Data])-1;

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

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

SELECT 
    Format(DateSerial(Year([Data]),[Month],1),"mmmm yyyy") AS YearMonth, 
    Sum(Nz(IIf(DateSerial(Year([Data]),[Month],1)=DateSerial(Year([Data]),Month([Date]),1),Table2.[Budget],0),0)) AS Total
FROM 
    (SELECT DISTINCT 
        [Tens]+[Ones] AS [Month], 
        10*Abs([Deca].[id] Mod 10) AS Tens, 
        Abs([Uno].[id] Mod 10) AS Ones
    FROM 
        MSysObjects AS Uno, 
        MSysObjects AS Deca) AS Months, 
    Table2
WHERE
    Months.[Month] Between 1 And 12
GROUP BY 
    DateSerial(Year([Data]),[Month],1)
ORDER BY 
    DateSerial(Year([Data]),[Month],1);

подзапрос ( Месяцы ) генерирует числа от 0 до 100. Они фильтруются по значениям месяца от 1 до 12.

Затем значения бюджета суммируются, группируются по году-месяцу.

0 голосов
/ 09 октября 2018

Вы должны создать переменную с таблицей со всеми месяцами, а затем соединить ее со своей таблицей, и ваша сумма должна быть ISNULL (SUM (...), 0)

Вы можете создать этостол таким образом ...

DECLARE @FromDate DATETIME, @ToDate DATETIME;
SET @FromDate = '2018-01-01';
SET @ToDate = '2018-12-31';
DECLARE @Dates table (
  TheDate date,
  month integer,
  year integer);

INSERT into @Dates 
SELECT TOP (DATEDIFF(MONTH, @FromDate, @ToDate)+1) 
 TheDate  = DATEADD(MONTH, number, @FromDate),
 TheMonth = MONTH(DATEADD(MONTH, number, @FromDate)),
 TheYear  = YEAR(DATEADD(MONTH, number, @FromDate))
FROM [master].dbo.spt_values 
WHERE [type] = N'P' ORDER BY number;

Select * FROM @Dates
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...