如何使用列和行的总计创建Access交叉表查询?

时间:2011-04-25 18:40:42

标签: sql ms-access crosstab

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

          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来解决最后一行的问题,但我似乎无法做到这一点。这似乎应该是一种常见的活动。

5 个答案:

答案 0 :(得分:5)

您基本上必须运行两次查询 - 一次获取数据,然后第二次提供聚合。如果您已经开始这样做,请进行第一个查询以将数据返回给自己的对象。然后进行另一个查询以聚合第一个另一个对象。创建一个最终的第三个查询对象,使用你提到的UNION来组合这两个查询对象。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

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

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

  

在子窗体下方,另一个子窗体足够短,只能容纳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

答案 3 :(得分:0)

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

进入设计模式并不适合我:

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

[我正在使用Access 2013]

答案 4 :(得分:0)

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

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

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