SQL / MS Access - Поиск пиковых дней в наборе данных - PullRequest
2 голосов
/ 06 мая 2019

У меня есть набор данных, который выглядит следующим образом (но, очевидно, намного больше):

Дата ------------------ Клиент ---------- Вывод
01.01.2016 01:00 ---------- 4 ---------------- 5
1/ 01/2016 03:00 ---------- 5 ---------------- 20
01.02.2016 09:00 ---------- 4 ---------------- 10
1/04/2016 06:00 ---------- 5 ---------------- 5
1/06/2016 13:00 ---------- 4 ---------------- 10
11.01.2016 23:00 ---------- 5 ---------------- 25
10.10.2016 12: 00 ---------- 5 ---------------- 15
2/10/2016 24:00 ---------- 4 ---------------- 25
14.02.2016 16:00 ---------- 4 ---------------- 10
16.02.2016 04:00 ---------- 5 ---------------- 5
14.02.2016 16:00 ---------- 5 ---------------- 10
16.02.2016 04:00 ---------- 4 ---------------- 5
18.02.2016 16:00 ---------- 5 ---------------- 10
19.02.2016, 12:00 ---------- 4 --------------- 5

Мне нужен запрос, который выполняет следующее:
1) может сказать, может лидата включена или не является пиковой, то есть, если это выходной или ИЛИ, если она выпадает на неделю или день недели
2), если она выпадает на будний день, должна быть возможность дальнейшей разбивки пика включения / выключения по часам (1-7 и 24 - непиковые, а 8-23 - пиковые)
3) иметь возможность сводить все это вместе по месяцам и в среднем

В основном это будет выглядеть так:

Месяц ----- Каст ------- Год --------- Ср. На пике ----------- Ср. На пике
1 ----------- 4 ------------- 2016 -------------- 10 -------------------------- 7.5
1 ----------- 5 ------------- 2016 -------------- 25 ------------------------ 12,5
2 ----------- 4 ------------- 2016 -------------- 15 -------------------------- 7.5
2 ----------- 5 ------------- 2016 -------------- 12.5 ---------------------- 12.5

У меня есть связанная таблица для доступа из Excel.Данные загружаются из онлайн-базы данных и хранятся в Excel (но, если лучше, хранить в Access LMK)

Я попытался использовать оператор switch:

Для справки [Hrly_Daily_Monthly 2]таблица, которая просто переводит datetime_beginning_ept в месяц, час, год и т. д.

[Внепиковые дни] - это таблица всех праздников

Switch(
[Hrly_Daily_Monthly 2].Date=#1/1/2016#, "off-peak day",
[Hrly_Daily_Monthly 2].Date=#5/30/2016# , "off-peak day",
[Hrly_Daily_Monthly 2].Date=#7/4/2016# , "off-peak day",
[Hrly_Daily_Monthly 2].Date=#9/5/2016# , "off-peak day",
[Hrly_Daily_Monthly 2].Date=#11/24/2016# , "off-peak day",
[Hrly_Daily_Monthly 2].Day = 1, "off-peak day",
[Hrly_Daily_Monthly 2].Day = 7, "off-peak day",

TRUE, "on-peak day") AS [On/Off Day]

Получить ошибку из-за слишком большого количества операторов.

Я также попытался создать несколько запросов, а не делать их в одном, и использовать Make Table, чтобы затем объединить все запросы.И это сильно замедлило работу базы данных.

Запрос непикового дня AKA [непиковые дни 2] таблица

SELECT [Hrly_Daily_Monthly 2].datetime_beginning_ept, [Hrly_Daily_Monthly 2].output, [Hrly_Daily_Monthly 2].cust, [Hrly_Daily_Monthly 2].Date
FROM [Hrly_Daily_Monthly 2], [Off peak list]
WHERE ([Hrly_Daily_Monthly 2].datetime_beginning_ept=[Off-peak days] OR [Day] NOT BETWEEN 2 and 6);

Запрос непикового дня (который зависит от непикового периода)запрос)

SELECT [Hrly_Daily_Monthly 2].Date, [Hrly_Daily_Monthly 2].cust, [Hrly_Daily_Monthly 2].output, 
FROM [Hrly_Daily_Monthly 2]
WHERE NOT EXISTS (Select 1 FROM [Off-Peak Days 2] WHERE [Off-Peak Days 2].Date = [Hrly_Daily_Monthly 2].Date AND [Hrly_Daily_Monthly 2].Date = [Off-Peak Days 2].Date);

любая помощь очень ценится

1 Ответ

0 голосов
/ 07 мая 2019

Имейте в виду, что полночь - это 0 часов в поле Дата / время доступа.

Рассмотрим этот запрос, который связывает таблицу данных с OffPeakDays и вычисляет части даты и коэффициент непиковой нагрузки:

SELECT datetime_beginning_ept, Customer, Output, Dt, Hr, Wd, Mo, Yr, OffPeakDays.HolDate, 
       IIf([Dt]=[HolDate] Or [Wd]<3 Or [Hr]<8, False, True) AS OnPeak
FROM OffPeakDays 
RIGHT JOIN 
    (SELECT datetime_beginning_ept, Customer, Output, DateValue([datetime_beginning_ept]) AS Dt, 
     Hour([datetime_beginning_ept]) AS Hr, WeekDay([datetime_beginning_ept],7) AS Wd, 
     Month([datetime_beginning_ept]) AS Mo, Year([datetime_beginning_ept]) AS Yr
     FROM DataTable) AS [Hrly_Daily_Monthly 2] 
ON OffPeakDays.HolDate = [Hrly_Daily_Monthly 2].Dt;

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

Один возможный запрос, основанный на вышеуказанном:

SELECT qryDateCalcs.Mo, qryDateCalcs.Customer, qryDateCalcs.Yr, 
     Avg(IIf([OnPeak],[Output],Null)) AS AvgOnPeak, 
     Avg(IIf(Not [OnPeak],[Output],Null)) AS AvgOffPeak
FROM qryDateCalcs
GROUP BY qryDateCalcs.Mo, qryDateCalcs.Customer, qryDateCalcs.Yr;
...