Полностью сгруппировать по месяцам в запросе? - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь написать SQL-запрос в Access, и это сводит меня с ума.

В таблице 1 есть столбец с моей датой (который будет содержать только 1-е или 15-е число месяца в формате мм / дд / гггг). Я также использую идентификационный номер здесь для каждого поля, чтобы получить счет. Он датируется 2013 годом, но я хочу только 2018.

Таблица 2 имеет месяц в формате (ммммм / гг) и прогноз количества в этом месяце.

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

Какой бы запрос я ни использовал, когда я присоединяюсь, я не получаю правильные итоги. То есть Всего в январе 2018 года могло быть 350 (между 1-м и 15-м), но когда я присоединяюсь к таблицам, будут встречаться только записи за 1-е число каждого месяца и показывать 300, например, за январь того года. Я играл с такими форматами даты, как сумасшедшие, и по какой-то причине он отказывается работать так, как я хочу. Если я выполню левое объединение, оно будет показывать 2 записи для каждого месяца - нет соответствующих данных прогноза по 15-м числам в таблице 2, так что это проблема. Просто не могу это исправить. Вот мой запрос ниже. Большое вам спасибо.

SELECT Format(([Table1].[Date]), "m/yy") AS [Month],
   Count([Table1].[ID]) AS Total,
   [Table2].Projection,
   FROM [Table1]
   INNER JOIN [Table2]
   ON [Table1].[Date] = [Table2].[Projection Date]
   WHERE ((([Table1].[Date]) Between [Enter Begin Date] And [Enter End Date])) 
   '''using all of 2018, so between 1/18 and 12/18
   GROUP BY Format(([Table1]),"m/yy"),[Table2].[Projection];

Образец данных таблицы 1:

ID       Date
1107     1/01/2018
1233     1/15/2018
1500     2/1/2018

Образец данных таблицы 2:

Projection Date     Projection
January18              270
February18             283    

Пример вывода с использованием кода выше:

Date     Total    Projection
Jan18     300         270
Feb18     301         283
March18   373         300

Пример вывода с использованием левого соединения вместо:

Date     Total    Projection
Jan18     300         270
Jan18     50          
Feb18     301         283
Feb18     60
March18   373         300
March18   38

Желаемый выход

Date     Total    Projection
Jan18     350         270
Feb18     361         283
March18   411         300

1 Ответ

0 голосов
/ 30 августа 2018
  • Вам необходимо преобразовать [Table1]. [Date] в nvarchar в вашем INNER JOIN, который должен быть левым.
  • Я полагаю [Table2]. [Projection Date] - это nvarchar "строка"?
  • Ваша GROUP BY должна соответствовать неагрегатам в SELECT.
  • Также в вашем SELECT вы захотите вернуть 0 проекции, когда объединение вернет NULL.

Если [Таблица2]. [Дата проекции] сохранена в виде текста, попробуйте использовать ниже;

    SELECT 
        Format(([Table1].[Date]), "MMM/yy") AS [Month],
        Count([Table1].[ID]) AS Total,
        ISNULL([Table2].Projection, 0) AS 'Projection'
    FROM [Table1]
        LEFT JOIN [Table2]
            ON FORMAT([Table1].[Date], 'MMM/yy') = [Table2].[Projection Date]
    WHERE ((([Table1].[Date]) Between [Enter Begin Date] And [Enter End Date])) 
    GROUP BY Format(([Table1].[Date]),"MMM/yy"),[Table2].[Projection];

Если [Таблица2]. [Дата проекции] сохранена как дата, вам нужно добавить EOMONTH () в объединение, и нет необходимости форматировать [Таблица1]. [Дата], попробуйте это;

SELECT 
    Format(([Table1].[Date]), "MMM/yy") AS [Month],
    Count([Table1].[ID]) AS Total,
    ISNULL([Table2].Projection, 0) AS 'Projection'
FROM [Table1]
    LEFT JOIN [Table2]
        ON EOMONTH([Table1].[Date]) = EOMONTH([Table2].[Projection Date])
WHERE ((([Table1].[Date]) Between [Enter Begin Date] And [Enter End Date])) 
GROUP BY Format(([Table1].[Date]),"MMM/yy"),[Table2].[Projection];

Извините за все правки!

...