【问题标题】:MS Access 13 SQL: How can I combine the results of four aggregate count subqueries?MS Access 13 SQL:如何组合四个聚合计数子查询的结果?
【发布时间】:2016-10-20 13:40:06
【问题描述】:

基本上,我正在尝试统计所有在 1 个月、2 个月、3 个月内以及超过特定安全课程到期日期的员工。所有四个查询都从同一组表中提取数据。

到目前为止,我已经为一个条件创建了一个查询,并为每个日期范围复制了它。返回的数据集类似如下:

公司 |前 | -------------- 极致 | 27 | 巴克梅 | 87 | 电子数据中心 | 21 | ...

我现在要做的是将它们组合起来,以便我有一个返回如下数据集的查询。

公司 |前 | M1 | M2 | M3 | ----------------------------------------- 极致 | 27 | 32 | 76 | 40 | 巴克梅 | 87 | 12 | 33 | 76 | 电子数据中心 | 21 | 44 | 65 | 87 |

我已经尝试创建一个联合,但没有得到我想要的结果,我也一直在尝试在子查询中创建一个内部连接。

但是,我真的不知道我在做什么。我将不胜感激任何帮助解决这个问题谢谢!

根据以下建议,我能够构建这个超级查询!而且效果很好。

<pre>
SELECT 
   Q0.CN, 
   Q0.EX, 
   Q1.M1, 
   Q2.M2, 
   Q3.M3
FROM 
   (((((
   SELECT 
      Companies.[Company Name] AS [CN], 
      Count(Companies.[Company Name]) AS [EX]
   FROM 
      (SELECT 
         Companies.[Company Name] 
      FROM 
         Courses INNER JOIN 
         ((Companies INNER JOIN 
           Candidates ON 
           Companies.[ID] = Candidates.[Company ID]) INNER JOIN 
           [Individual Candidate Course History] ON 
           Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) ON 
           Courses.[ID] = [Individual Candidate Course History].[Course ID] 
    WHERE 
       (([Individual Candidate Course History].[Valid Until])<Date()) 
    ORDER BY 
       [Individual Candidate Course History].[Valid Until]) 
    GROUP BY 
       Companies.[Company Name]) AS Q0 LEFT JOIN
    (SELECT 
       Companies.[Company Name] AS [CN], 
       Count(Companies.[Company Name]) AS M1
     FROM 
        (SELECT 
           Companies.[Company Name] 
         FROM 
           Courses INNER JOIN 
           ((Companies INNER JOIN 
             Candidates ON 
             Companies.[ID] = Candidates.[Company ID]) INNER JOIN 
             [Individual Candidate Course History] ON 
             Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) ON 
             Courses.[ID] = [Individual Candidate Course History].[Course ID] 
    WHERE 
       ((([Individual Candidate Course History].[Valid Until]) 
       Between Date() And DateAdd("m",1,Date()))) 
    ORDER BY 
       [Individual Candidate Course History].[Valid Until]) 
    GROUP BY 
       Companies.[Company Name]) AS Q1 ON 
   Q0.CN = Q1.CN) LEFT JOIN
   (SELECT 
      Companies.[Company Name] AS [CN], 
      Count(Companies.[Company Name]) AS M2
    FROM 
       (SELECT 
          Companies.[Company Name] 
        FROM 
          Courses INNER JOIN 
          ((Companies INNER JOIN 
          Candidates ON 
          Companies.[ID] = Candidates.[Company ID]) INNER JOIN 
          [Individual Candidate Course History] ON 
          Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) ON 
          Courses.[ID] = [Individual Candidate Course History].[Course ID] 
       WHERE 
          ((([Individual Candidate Course History].[Valid Until]) 
         Between DateAdd("m",1,Date()) And DateAdd("m",2,Date()))) 
      ORDER BY 
         [Individual Candidate Course History].[Valid Until]) 
 GROUP BY 
    Companies.[Company Name] 
 ORDER BY 
    Companies.[Company Name]) AS Q2 ON 
 Q0.CN = Q2.CN) LEFT JOIN
 (SELECT 
    Companies.[Company Name] AS [CN], 
    Count(Companies.[Company Name]) AS M3
  FROM 
    (SELECT 
       Companies.[Company Name] 
    FROM 
       Courses INNER JOIN 
       ((Companies INNER JOIN 
       Candidates ON 
       Companies.[ID] = Candidates.[Company ID]) 
       INNER JOIN [Individual Candidate Course History] ON 
       Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) ON 
       Courses.[ID] = [Individual Candidate Course History].[Course ID] 
    WHERE 
    ((([Individual Candidate Course History].[Valid Until]) 
    Between DateAdd("m",2,Date()) And DateAdd("m",3,Date()))) 
    ORDER BY 
       [Individual Candidate Course History].[Valid Until]) 
    GROUP BY 
       Companies.[Company Name] 
 ORDER BY 
    Companies.[Company Name]) AS Q3 ON 
 Q0.CN = Q3.CN))
        </pre>

【问题讨论】:

  • 请编辑问题并显示您构建的查询。

标签: sql ms-access subquery


【解决方案1】:

考虑仅对月份列使用一个带有条件聚合的查询。虽然我不知道您的日期表达式,但将每个查询的 WHERE 子句移动到 IIF() 逻辑语句中,该语句包含在 SUM() 的 1 和 0 计算中。此外,使用任何需要的 JOIN 语句调整 FROM 子句。

SELECT t.Company, Count(t.*) AS [EX],
       SUM(IIF(DATEDIFF('m', Date(), t.ExpiryDate) = 1, 1, 0) AS [M1],
       SUM(IIF(DATEDIFF('m', Date(), t.ExpiryDate) = 2, 1, 0) AS [M2],
       SUM(IIF(DATEDIFF('m', Date(), t.ExpiryDate) = 3, 1, 0) AS [M3]
FROM TableName t
GROUP BY t.Company

根据 OP 对实际工作查询的更新,考虑以下不使用子查询的查询:

SELECT 
   Companies.[Company Name] AS [CN], 
   SUM(IIF([Individual Candidate Course History].[Valid Until] <= Date(), 1, 0)) AS [EX],
   SUM(IIF([Individual Candidate Course History].[Valid Until]
           BETWEEN Date() AND DateAdd("m",1,Date()), 1, 0)) AS [M1],
   SUM(IIF([Individual Candidate Course History].[Valid Until]
           BETWEEN DateAdd("m",1,Date()) AND DateAdd("m",2,Date()), 1, 0)) AS [M2],
   SUM(IIF([Individual Candidate Course History].[Valid Until]
           BETWEEN DateAdd("m",2,Date()) AND DateAdd("m",3,Date()), 1, 0)) AS [M3]

FROM       
   Courses INNER JOIN 
   ((Companies INNER JOIN 
     Candidates ON Companies.[ID] = Candidates.[Company ID]) 
     INNER JOIN [Individual Candidate Course History] 
         ON Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) 
   ON Courses.[ID] = [Individual Candidate Course History].[Course ID]  
GROUP BY 
   Companies.[Company Name] 

【讨论】:

  • 刚刚用过上面的效果很好,谢谢Parfait!现在我把它变成了一个 SELECT ... INTO 语句!!!
  • 太棒了!请接受最有帮助的答案以确认解决方案。
【解决方案2】:

你想要Left join

select Qry1.Company, Qry1.Ex, Qry2.Ex as M1, Qry3.Ex as M2, Qry4.Ex as M3
from ((Qry1
left join Qry2
  on Qry1.Company = Qry2.Company)
left join Qry3
  on Qry1.Company = Qry3.Company)
left join Qry4
  on Qry1.Company = Qry4.Company

【讨论】:

  • 请注意 MS Access SQL 连接配对需要括号,否则 OP 会出错。
  • 我还是不明白为什么 Access 不能使用 SQL Server 语法操作...愚蠢的 MS。
  • ON 子句周围不需要括号,但 JOIN 语句需要括号。查看我的编辑。
  • @Parfait 谢谢,好久不见
  • 这似乎正在处理 2 个查询。会继续添加它们。谢谢约翰!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多