结合MS Access中使用的两个查询(秩和累积)

时间:2015-03-18 22:12:42

标签: sql ms-access ranking running-total

我有两个问题:

  1. 将按时间零点(标准化或排名)对每日读数求和 - 从等式中抽出时间。
  2. CUM读数会随着时间的推移而累计。
  3. 我想将两者结合起来,以便我可以获得标准化/时间零/排名数据的累积输出。

    这是零时间查询(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;
    

1 个答案:

答案 0 :(得分:0)

对于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;