В моей попытке создать отчет MS Access для базового анализа пороговых значений я создал 3 последовательных запроса.Производительность ужасна, учитывая, насколько они неэффективны, и я также не получаю ожидаемых результатов от окончательного запроса (объяснено ниже).Будем очень благодарны за любые предложения по очистке.
Первый запрос (Day_Period_Bins_qry1) выполняется как посещенный и суммирует мои данные в различные «корзины» дневного периода, которые построены в обратном порядке от даты, введенной в форму.(Main_frm! Date_prompt_txt).Запрос (ниже) является чрезвычайно тупым, но это то, что я понял
'Category' as N_group,
Data_tbl.Item_Category as Item,
Sum(IIf([Data_tbl].[occ_date]<=[Forms]![Main_frm]![Date_prompt_txt] And [Data_tbl].[occ_date]>=DateAdd("d",-6,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 7Day_Curnt,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-7,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-13,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 7Day_1,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-14,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-20,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 7Day_2,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-21,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-27,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 7Day_3,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-28,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-34,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 7Day_4,
Sum(IIf([Data_tbl].[occ_date]<=[Forms]![Main_frm]![Date_prompt_txt] And [Data_tbl].[occ_date]>=DateAdd("d",-27,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 28Day_Curnt,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-28,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-55,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 28Day_1,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-56,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-83,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 28Day_2,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-84,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-111,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 28Day_3,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-112,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-139,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 28Day_4,
Sum(IIf([Data_tbl].[occ_date]<=[Forms]![Main_frm]![Date_prompt_txt] And [Data_tbl].[occ_date]>=DateAdd("d",-83,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 84Day_Curnt,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-84,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-167,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 84Day_1,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-168,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-251,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 84Day_2,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-252,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-335,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 84Day_3,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-336,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-419,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 84Day_4,
Sum(IIf([Data_tbl].[occ_date]<=[Forms]![Main_frm]![Date_prompt_txt] And [Data_tbl].[occ_date]>=DateAdd("d",-363,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 364Day_Curnt,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-364,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-727,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 364Day_1,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-728,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-1091,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 364Day_2,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-1092,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-1455,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 364Day_3,
Sum(IIf([Data_tbl].[occ_date]<=DateAdd("d",-1456,[Forms]![Main_frm]![Date_prompt_txt]) And [Data_tbl].[occ_date]>=DateAdd("d",-1819,[Forms]![Main_frm]![Date_prompt_txt]),1,Null)) AS 364Day_4
FROM Data_tbl
GROUP BY Data_tbl.Item_Category
Есть два других запроса, объединенных с вышеупомянутым запросом, которые запрашивают item_type и item_category.
Второй запрос (Columns_qry2) помещает данные из вышеупомянутого запроса в столбцы, чтобы третий столбец мог выполнить некоторые вычисления
Select
N_group,
Item,
nz([7Day_Curnt],0) as nCount,
'7Day' as Day_Period,
'Current' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
Select
N_group,
Item,
Nz( [7Day_1],0) as nCount,
'7Day' as Day_Period,
'1' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT N_group,
Item,
Nz( [7Day_2],0) as nCount,
'7Day' as Day_Period,
'2' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT
N_group,
Item,
Nz( [7Day_3],0) as nCount,
'7Day' as Day_Period,
'3' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT N_group,
Item,
Nz( [7Day_4],0) as nCount,
'7Day' as Day_Period,
'4' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
Select
N_group,
Item,
nz([28Day_Curnt],0) as nCount,
'28Day' as Day_Period,
'Current' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT
N_group,
Item,
Nz( [28Day_1],0) as nCount,
'28Day' as Day_Period,
'1' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT
N_group, Item,
Nz( [28Day_2],0) as nCount,
'28Day' as Day_Period,
'2' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT
N_group, Item,
Nz( [28Day_3],0) as nCount,
'28Day' as Day_Period,
'3' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT
N_group, Item,
Nz( [28Day_4],0) as nCount,
'28Day' as Day_Period,
'4' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
Select
N_group,
Item,
nz([84Day_Curnt],0) as nCount,
'84Day' as Day_Period,
'Current' as Day_bin
FROM Day_Period_Bins_qry1
Union All
SELECT
N_group,
Item,
Nz( [84Day_1],0) as nCount,
'84Day' as Day_Period,
'1' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT N_group,
Item,
Nz( [84Day_2],0) as nCount,
'84Day' as Day_Period,
'2' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT
N_group, Item,
Nz( [84Day_3],0) as nCount,
'84Day' as Day_Period,
'3' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT N_group,
Item, Nz( [84Day_4],0) as nCount,
'84Day' as Day_Period,
'4' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
Select
N_group,
Item,
nz([364Day_Curnt],0) as nCount,
'364Day' as Day_Period,
'Current' as Day_bin
FROM Day_Period_Bins_qry1
Union All
SELECT
N_group,
Item,
Nz( [364Day_1],0) as nCount,
'364Day' as Day_Period,
'1' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT N_group, Item,
Nz( [364Day_2],0) as Count,
'364Day' as Day_Period,
'2' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL
SELECT
N_group, Item,
Nz( [364Day_3],0) as nCount,
'364Day' as Day_Period,
'3' as Day_bin
FROM Day_Period_Bins_qry1
UNION ALL SELECT N_group, Item,
Nz( [364Day_4],0) as nCount,
'364Day' as Day_Period,
'4' as Day_bin
FROM Day_Period_Bins_qry1;
Последний запрос не завершен и находится на третьей или четвертой итерации.В настоящее время у меня возникают проблемы с выяснением того, как заставить столбцы выполнять вычисления только в одном и том же дневном периоде (т. Е. Рассчитывать только среднее для бинов [7day] для сравнения с текущим 7-дневным счетчиком. Ранее было добавлено простое предложение where (гдеday_bin = '7day) и повторяется в запросах объединения для других дневных периодов, что дало бы мне требуемые результаты, но при добавлении еще одного запроса объединения был журнал, который сломал верблюдов, вызвав сбой.
SELECT
Columns_qry2.N_group AS N_group,
Columns_qry2.item AS Item,
Columns_qry2.Day_period,
Columns_qry2.nCount AS Current_Ct,
Round(Avg(Columns_qry2.[nCount]),2) AS Avg_Prev4_Bins,
Round((Day_Period_bins_qry1.[7Day_Curnt]-[Avg_Prev4_Bins])/StDevP([nCount]),2) AS Z_score,
Round((Day_Period_bins_qry1.[7Day_Curnt]-Avg([nCount]))/Avg([nCount]),2) AS PercentChg_From_BinAvg_Prev4Bins,
Round(Day_Period_Bins_qry1.[7Day_Curnt]/(Select SUM(Day_Period_Bins_qry1.[7Day_Curnt]) FROM Day_Period_Bins_qry1),2) AS Percent_of_Total_Current,
Round(Avg(Day_Period_bins_qry1.[7Day_1]/(Select SUM(Day_Period_bins_qry1.[7Day_1]) FROM Day_Period_bins_qry1)+Day_Period_bins_qry1.[7Day_2]/(Select SUM(Day_Period_bins_qry1.[7Day_2]) FROM Day_Period_bins_qry1)+Day_Period_bins_qry1.[7Day_3]/(Select SUM(Day_Period_bins_qry1.[7Day_3]) FROM Day_Period_bins_qry1)+Day_Period_bins_qry1.[7Day_4]/(Select SUM(Day_Period_bins_qry1.[7Day_4]) FROM Day_Period_bins_qry1))/4,2) AS Avg_Percent_of_Tot_prev4_Bins,
Round(([Percent_of_Total_Current]-Avg_Percent_of_Tot_prev4_Bins)/Avg_Percent_of_Tot_prev4_Bins,4) AS PercentChg_Percent_of_Total
FROM Columns_qry2
INNER JOIN Day_Period_bins_qry1
ON Day_Period_bins_qry1.item = Columns_qry2.Item
GROUP BY Columns_qry2.N_group, Columns_qry2.item, Columns_qry2.Day_period, Columns_qry2.nCount, Day_Period_bins_qry1.[7Day_Curnt];