Объединить два запроса (ранговый и кумулятивный), используемые в MS Access

У меня есть два запроса:

  1. Суммирует ежедневные показания по нулевому времени (нормированному или ранжированному) — время уходит из уравнения.
  2. Будут показания CUM через раз, нарастающим итогом.

Я хотел бы объединить их, чтобы иметь совокупный вывод нормализованных/нулевых по времени/ранжированных данных.

Вот запрос нулевого времени (1):

SELECT Sum([_Group_Norm_Query].Sales) AS SumOfSales 
FROM (SELECT 
tblTempGroupNorm.Prop_KEY, 
tblTempGroupNorm.ReadingDate,
tblTempGroupNorm.Sales, 
(SELECT COUNT(Table1A.ReadingDate) FROM tblTempGroupNorm AS Table1A 
 WHERE Table1A.ReadingDate<=tblTempGroupNorm.ReadingDate 
 AND Table1A.Prop_KEY = tblTempGroupNorm.Prop_KEY) AS TimeDay 
FROM
tblProperties INNER JOIN tblTempGroupNorm ON tblProperties.WH_IDX = tblTempGroupNorm.Prop_KEY 
WHERE (((tblProperties.GROUP)='MY GROUP') AND ((tblProperties.AREA)='MY AREA')) ORDER BY
tblTempGroupNorm.ReadingDate) AS [_Group_Norm_Query] 
GROUP BY[_Group_Norm_Query].TimeDay;

А вот промежуточный итоговый запрос (2):

SELECT Sum(a2.Sales) AS SumOfSales
FROM tblTempGroupNorm AS a1 INNER JOIN (tblTempGroupNorm AS a2 INNER JOIN tblProperties ON a2.Prop_KEY = tblProperties.WH_IDX) ON a1.Prop_KEY = tblProperties.WH_IDX
WHERE (((a2.ReadingDate)<=[a1].[ReadingDate]) AND (([tblProperties].[GROUP])='MY GROUP') AND (([tblProperties].[AREA])='MY AREA'))
GROUP BY a1.ReadingDate
ORDER BY a1.ReadingDate;

Есть мысли о совмещении этих двух вещей? Я избегаю использования DSUM() в промежуточном итоге и не могу использовать его в финальном комбинированном запросе. Спасибо

Редактировать. Следуя отзывам, я попытаюсь их объединить. Я получаю сообщение об ошибке:

запрос не включает указанное выражение 'COUNT(a2.ReadingDate) = [_Group_Norm_Query].TimeDay как часть агрегатной функции.

Если я удалю самую последнюю строку (GOUP BY [_Group_Norm_Query].TimeDay;, ошибка будет подавлена, но запрос никогда не завершится - он зависнет.

SELECT Sum([_Group_Norm_Query].Sales) AS SumOfSales, Sum(RunTotal.SumOfSales) AS MY_RUNNING_TOTAL 

SELECT Sum(a2.Sales) AS SumOfSales
FROM tblTempGroupNorm AS a1 INNER JOIN (tblTempGroupNorm AS a2 INNER JOIN tblProperties ON a2.Prop_KEY = tblProperties.WH_IDX) ON a1.Prop_KEY = tblProperties.WH_IDX
WHERE (((a2.ReadingDate)<=[a1].[ReadingDate]) AND (([tblProperties].[GROUP])='MY GROUP') AND (([tblProperties].[AREA])='MY AREA'))
GROUP BY a1.ReadingDate
HAVING COUNT(a2.ReadingDate) = [_Group_Norm_Query].TimeDay
ORDER BY a1.ReadingDate) AS RunTotal

FROM (SELECT 
tblTempGroupNorm.Prop_KEY, 
tblTempGroupNorm.ReadingDate,
tblTempGroupNorm.Sales, 
    (SELECT COUNT(Table1A.ReadingDate) FROM tblTempGroupNorm AS Table1A 
    WHERE Table1A.ReadingDate<=tblTempGroupNorm.ReadingDate 
     AND Table1A.Prop_KEY = tblTempGroupNorm.Prop_KEY) AS TimeDay 
FROM
tblProperties INNER JOIN tblTempGroupNorm ON tblProperties.WH_IDX = tblTempGroupNorm.Prop_KEY 
WHERE (((tblProperties.GROUP)='MY GROUP') AND ((tblProperties.AREA)='MY AREA')) ORDER BY
tblTempGroupNorm.ReadingDate) AS [_Group_Norm_Query]

GROUP BY[_Group_Norm_Query].TimeDay;

person bs0d    schedule 18.03.2015    source источник
comment
DSum по сути является подзапросом. Почему бы не добавить второй запрос в первый как второй подзапрос после TimeDay?   -  person Parfait    schedule 19.03.2015
comment
Первый суммирует продажи для всех свойств, соответствующих предложению where, на нормализованной основе. второй создаст промежуточный итог во времени (данные не нормализованы). Поэтому мне нужно иметь промежуточную сумму первых результатов запроса. Я не уверен, что добавление второго запроса в первый сделает это.   -  person bs0d    schedule 19.03.2015
comment
Я только что попытался это сделать и получил предупреждение, которого раньше не видел: этот подзапрос может вернуть не более одной записи.   -  person bs0d    schedule 23.03.2015
comment
Вы должны связать подзапрос с внешним запросом построчно. Попробуйте добавить это предложение HAVING после GROUP BY во второй запрос, который я предлагаю использовать в качестве подзапроса в первом: HAVING COUNT(a2.ReadingDate) = [_Group_Norm_Query].TimeDay   -  person Parfait    schedule 24.03.2015
comment
Я попытался добавить текущий общий запрос в качестве подзапроса к первому. SQL был добавлен после AS _Group_Norm_Query, и я добавил предложенное вами условие HAVING. Однако запрос не распознает [_Group_Norm_Query].TimeDay, используемый в операторе HAVING, подсказка представляется так, как если бы поле было параметром. Может быть, я добавляю не в то место в запросе?   -  person bs0d    schedule 24.03.2015
comment
Попробуйте добавить подзапрос с предложением HAVING после самой первой строки внешнего основного запроса: SELECT Sum([_Group_Norm_Query].Sales) AS SumOfSales. Точно так же, как самая последняя GROUP BY строка, которая является частью внешнего основного запроса, TimeDay должен быть распознан.   -  person Parfait    schedule 25.03.2015
comment
Я сделал изменение. TimeDay теперь распознается, но возникла проблема с группировкой. Я чувствую, что мы близки. См. редактирование в сообщении для текущего статуса мэш-апа запроса.   -  person bs0d    schedule 25.03.2015


Ответы (1)


Для вашей ошибки предложения HAVING попробуйте исправить пунктуацию вокруг вашего подзапроса - запятую и круглую скобку:

SELECT [_Group_Norm_Query].TimeDay, Sum([_Group_Norm_Query].Sales) AS SumOfSales, 
Sum(RunTotal.SumOfSales) AS MY_RUNNING_TOTAL, 

  (SELECT Sum(a2.Sales) AS SumOfSales
   FROM tblTempGroupNorm AS a1 
   INNER JOIN (tblTempGroupNorm AS a2 
   INNER JOIN tblProperties ON a2.Prop_KEY = tblProperties.WH_IDX) 
          ON a1.Prop_KEY = tblProperties.WH_IDX
   WHERE (((a2.ReadingDate)<=[a1].[ReadingDate]) 
          AND (([tblProperties].[GROUP])='MY GROUP') 
          AND (([tblProperties].[AREA])='MY AREA'))
   GROUP BY a1.ReadingDate
   HAVING COUNT(a2.ReadingDate) = [_Group_Norm_Query].TimeDay
   ORDER BY a1.ReadingDate) AS RunTotal

FROM 
    (SELECT tblTempGroupNorm.Prop_KEY, tblTempGroupNorm.ReadingDate,
        tblTempGroupNorm.Sales, 
    (SELECT COUNT(Table1A.ReadingDate) FROM tblTempGroupNorm AS Table1A 
     WHERE Table1A.ReadingDate<=tblTempGroupNorm.ReadingDate 
        AND Table1A.Prop_KEY = tblTempGroupNorm.Prop_KEY) AS TimeDay 
     FROM tblProperties 
     INNER JOIN tblTempGroupNorm ON tblProperties.WH_IDX = tblTempGroupNorm.Prop_KEY 
     WHERE (((tblProperties.GROUP)='MY GROUP') AND ((tblProperties.AREA)='MY AREA')) 
     ORDER BY tblTempGroupNorm.ReadingDate) AS [_Group_Norm_Query]

GROUP BY[_Group_Norm_Query].TimeDay;
person Parfait    schedule 26.03.2015
comment
Запрос не включает указанное выражение COUNT(a2.ReadingDate)=[_Group_Norm_Query].TimeDay как часть агрегатной функции. - person bs0d; 27.03.2015
comment
Смотрите мою правку. Попробуйте добавить [_Group_Norm_Query].TimeDay в строку SELECT. Предложение HAVING может не видеть поле из внешнего запроса. - person Parfait; 28.03.2015
comment
Проверьте предложение HAVING с любым числом, например 5, чтобы увидеть, выполняется ли запрос: HAVING COUNT(a2.ReadingDate) = 5 - person Parfait; 31.03.2015
comment
Если я внесу изменения, как вы предложили, запрос запустится. Я получаю время, считая от 1 до правильного количества строк. SumOfSales также выглядит правильно. Затем я получаю еще 2 столбца: MY_RUNNING_TOTAL и RunTotal. MY_RUNNING_TOTAL возвращает значения, одинаковые для нескольких строк, затем изменяются на меньшее число, и шаблон повторяется. У меня такое ощущение, что он возвращает сумму продаж для всех свойств с ‹= этому количеству дней. Затем, когда количество свойств уменьшается, значение суммы изменяется. R unTotal возвращает одно и то же число для всех строк, очень небольшое число по отношению к выходным данным, возможно, сумма 5 дней. - person bs0d; 01.04.2015