【问题标题】:Date Join Query with Calculated Fields带有计算字段的日期连接查询
【发布时间】:2013-01-04 13:00:55
【问题描述】:

我正在创建一个 Access 2010 数据库来替换旧的 Paradox 数据库。刚刚开始查询,毫无疑问我是 SQL 新手。

我要做的是设置一个供图表使用的查询。图表的 Y 轴是一个简单的通过百分比,X 轴是某一天。该图表将在表单加载和随后输入的新记录时创建,日期范围为“Between Date() And Date()-30”(30 天,滚动)。

我正在使用的数据库每天可以进行多次检查,多次通过和多次失败。每次检查都是单独的记录。

例如,2012 年 11 月 26 日进行了 7 次检查; 5 次通过,2 次失败,接受率为 71% ((5/7)*100%)。 “11/26/2012”和“71%”代表图表上的一个数据点。 2012 年 11 月 27 日进行了 8 次检查; 4 次通过,4 次失败,接受率为 50%。等等。

这是一个查询示例,其中包含日期范围“11/26/2012 - 11/27/2012:”的“日期”和“处置”字段:

SELECT Inspection.Date, Inspection.Disposition
FROM Inspection
WHERE (((Inspection.Date) Between #11/26/2012# And #11/27/2012#) AND ((Inspection.Disposition)="PASS" Or (Inspection.Disposition)="FAIL"));

Date       | Disposition
11/26/2012 | PASS
11/26/2012 | FAIL
11/26/2012 | FAIL
11/26/2012 | PASS
11/26/2012 | PASS
11/26/2012 | PASS
11/26/2012 | PASS
11/27/2012 | PASS
11/27/2012 | PASS
11/27/2012 | FAIL
11/27/2012 | PASS
11/27/2012 | FAIL
11/27/2012 | PASS
11/27/2012 | FAIL
11/27/2012 | FAIL

*注意 - 日期字段的类型为“日期”,而处置字段的类型为“文本”。有些日子没有进行检查,这些日子不会出现在图表上。检查处置也可以列为“不适用”,指的是另一种不绘制图表的检查。

这是我想在另一个查询中创建的布局(再次为简洁起见,范围内只有 2 天):

Date       | # Insp | # Passed | # Failed | % Acceptance
11/26/2012 | 7      | 5        | 2        | 71 
11/27/2012 | 8      | 4        | 4        | 50 

我认为需要做的是对记录日期本身和其余查询结果中的“计算字段”进行某种类型的连接。问题是 我还没有找到如何按日期“展平”记录并在一个查询中维护检查次数和通过/失败次数的计数。我需要为此进行多层查询吗?我不喜欢将任何查询存储为表格,因为这些数字的唯一用途是图形形式。

我正在考虑在数据库中创建新列,以通过分配 PASS“1”和 FAIL“0”来绕过“Disposition”字段为 Textual,但这似乎是一种逃避。必须有一种方法可以在 SQL 中完成这项工作,只是我还没有找到适用的示例。

感谢您的帮助!任何意见或建议表示赞赏!包含表单、查询和图表的示例数据库也很有帮助!

【问题讨论】:

    标签: sql inner-join outer-join calculated-field


    【解决方案1】:

    您可以按Date 分组,然后使用sumcount 等聚合来计算该组的统计信息:

    select  Date
    ,       count(*) as [# Insp]
    ,       sum(iif(Disposition = 'PASS',1,0)) as [# Passed]
    ,       sum(iif(Disposition = 'FAIL',1,0)) as [# Failed]
    ,       100.0 * sum(iif(Disposition = 'PASS',1,0)) / count(*) as [% Acceptance]
    from    YourTable
    where   Disposition in ('PASS', 'FAIL')
    group by
            Date
    

    【讨论】:

    • 这似乎可以解决问题!我只需要解决旧导入数据库中的烦人问题,以确保它是万无一失的。使用新的条目验证数据,效果很好!谢谢!
    • count(*) 是一个包罗万象的,因为它计算所有记录?是否可以传递参数以将计数限制为仅具有“PASS”或“FAIL”的记录?
    • 您可以添加一个 where 子句来做到这一点,并在答案中更新。或者sum(iif(or(Disposition = 'PASS',Disposition = 'FAIL'),1,0)) 的行为就像只计算通过和失败。
    • 现在我明白了。这些命令就像堆叠的掩码(过滤器)。如果“Where”可以代替“Select”中的一堆If语句,则“Select”不需要包罗万象。这是一个简单的解决方法,并且保持代码干净且易于阅读。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2019-03-03
    • 2022-12-08
    • 1970-01-01
    • 2019-09-29
    • 2020-06-20
    • 2016-09-05
    相关资源
    最近更新 更多