【问题标题】:How to create an Access crosstab query with totals for the columns AND the rows?如何使用列和行的总计创建 Access 交叉表查询?
【发布时间】:2011-08-12 12:18:47
【问题描述】:

我希望我的查询结果如下所示:

          Person1 Person2 Person3 Person4    Total 
Status1         2       4       7       3      16
Status2         0       1       0       3      4
Status3         0       0       0       0      0
Status4         0       1       3       0      4
Total           2       6       10      6      24

我可以得到除了最下面一行之外的所有内容:

TRANSFORM Count(personName) 
SELECT status, Count(status) AS Total
FROM table1 
GROUP BY status
PIVOT personName

我发现了一些关于使用 UNION 来添加最后一行的内容,但我似乎无法完全理解这一点。看起来这应该是一个常见的活动。

【问题讨论】:

  • 你能解释一下你正在寻找的结果吗?
  • 我正在寻找的结果是我在顶部发布的表格。它下面的查询不包括底行。

标签: sql ms-access crosstab


【解决方案1】:

您基本上必须运行两次查询 - 一次获取数据,然后第二次提供聚合。如果您打算这样做,请进行第一个查询以将数据返回为它自己的对象。然后进行另一个查询以聚合第一个另一个对象。如您所述,创建最后一个第三个查询对象以使用 UNION 将两者结合起来。

虽然我不得不说我真的不推荐这个。听起来您正试图强制 SQL 生成一些真正的表现信息(即它不属于同一个数据集)。

【讨论】:

  • 我同意联合是一种很老套的方法。交叉表查询让我完成了 90% 的工作,如果我只需要运行一次,Access 会基于此生成精美的报告。但是,这将需要运行多次,我不希望用户使用报告向导生成自己的报告。因此,无需在运行时生成标签和文本框,数据表视图就足够了。
  • 如果仅用于报告目的,为什么不使用摘要页脚?例如,您可以将页脚中文本框的值设置为 =Sum(person1)。
  • 仅用于报告目的。虽然取决于报告的生成方式,但文本框的数量会有所不同。考虑在运行时用标签布局盒子让我畏缩。
  • +1 表示关于表示层的注意事项——这不属于 SQL 语句。
  • @HuckIt,您可以动态执行的操作有一个实际限制;虽然您可以根据需要为查询中的人员列布置文本框,但超出某个点您将无法整齐地显示它们,尤其是在要打印报告时。如果可以设置限制,则无需在运行时创建标签和框,只需创建将在设计视图中显示的最大值并在运行时根据需要隐藏或显示它们。
【解决方案2】:

这个问题实际上有一个简单的解决方案。设计完交叉表查询后,进入查询中的设计模式并在“主页”选项卡的“记录”部分中选择“总计”。然后你可以选择 Sum 或 Count 等......

这是一个提供步骤的链接:http://office.microsoft.com/en-us/access-help/display-column-totals-in-a-datasheet-HA001233062.aspx

【讨论】:

  • 有人能举例说明如何通过 VBA 做到这一点吗?我想在代码中控制它,因为交叉表查询返回的列数是可变的,并且不能总是在设计器中配置。
  • 这是用于固定列数的内容。感谢发帖!
【解决方案3】:

我也一直在寻找解决方案。除了基于交叉表编写查询然后将该查询相加并添加到联合查询的底部之外,也找不到一个。由于我尝试从表单内部执行所有 SQL 语句(更易于部署),我不喜欢这种方法:从代码等中编写或重新填充 Querydef/视图。

如果您在表单的子表单中显示结果,您可以执行以下操作:

在子窗体下方,另一个子窗体足够短,只能容纳 1 记录。

将表单中的控件绑定到一个函数,如下:

control1 = fnADOSum(yourCrosstabfield1, yourCrosstabSQL) 

Public Function fnADOSum(fldName As String, strInputSQL As String) As Double
    On Error GoTo ERRHANDLER

    Dim RS1 As ADODB.Recordset
    Dim cnn As ADODB.Connection
    Dim StrSQL As String
    Dim dblRunTot As Double


    Set RS1 = New ADODB.Recordset
    RS1.CursorLocation = adUseServer
    Set cnn = CurrentProject.Connection

    dblRunTot = 0

    With RS1
    .Open strInputSQL, cnn, adOpenForwardOnly, adLockReadOnly
        If Not .EOF And Not .BOF Then
            .MoveFirst
            Do Until .EOF
            dblRunTot = dblRunTot + Nz(.Fields(fldName).Value, 0)
            .MoveNext
            Loop
        End If
    .Close
    End With

    fnADOSum = dblRunTot

    'CLEAN UP:
    cnn.Close
    Set RS1 = Nothing
    Set cnn = Nothing


    EXITHANDLER:
    Exit Function

    ERRHANDLER:
    '' your own error handling proc
    '' LogError err.Number, err.Description


End Function

【讨论】:

    【解决方案4】:

    Lydia 写道:“这个问题实际上有一个简单的解决方案。一旦您设计了交叉表查询,请进入查询中的设计模式并在“主页”选项卡的“记录”部分中选择“总计”。然后您可以选择总和或计数等......”

    进入设计模式对我不起作用:

    • 我运行了查询。
    • 然后转到“主页”选项卡
    • “记录”部分中的选定总计
    • 标签“总计”出现在交叉表查询结果的底部,但还没有实际总计。
    • 单击“总计”标签右侧的空白单元格。
    • 出现一个箭头,我选择了“Sum”。

    [我正在使用 Access 2013]

    【讨论】:

    • 这应该是一条评论
    【解决方案5】:

    经过多次尝试和错误发现...

    要在输入表单或子表单时打开总计行,您可以在表单代码中添加以下 VBA:

    Private Sub YourFormName_Enter()
        If Application.CommandBars.GetPressedMso("RecordsTotals") = False Then
            Application.CommandBars.ExecuteMso "RecordsTotals"
        End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 2015-04-18
      • 2014-09-17
      • 2020-11-10
      相关资源
      最近更新 更多