Как создать перекрестный запрос Access с итогами для столбцов И строк? - PullRequest
4 голосов
/ 25 апреля 2011

Я хочу, чтобы результаты моего запроса выглядели так:

          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, чтобы присоединиться к последнему ряду, но я не могу понять, что это правильно.Похоже, это должно быть обычным делом.

Ответы [ 4 ]

5 голосов
/ 31 мая 2013

На самом деле существует простое решение этой проблемы.После того, как вы спроектировали кросс-таблицу, перейдите в режим разработки внутри запроса и выберите «Итоги» в разделе «Записи» на вкладке «Главная».Затем вы можете выбрать сумму или количество и т.д ....

Вот ссылка, которая дает шаги: http://office.microsoft.com/en-us/access-help/display-column-totals-in-a-datasheet-HA001233062.aspx

5 голосов
/ 25 апреля 2011

В основном вам нужно выполнить запрос дважды - один раз, чтобы получить данные, а затем второй раз, чтобы получить агрегаты.Если вы настроены на это, сделайте первый запрос, чтобы вернуть данные своему собственному объекту.Затем сделайте еще один запрос для агрегирования первого и другого объекта.Создайте третий объект запроса, чтобы объединить их, используя UNION, как вы упомянули.

Хотя я должен сказать, что я не очень рекомендую это.Похоже, вы пытаетесь заставить SQL генерировать что-то действительно презентационное (то есть, оно не принадлежит одному и тому же набору данных).

0 голосов
/ 01 августа 2017

Лидия пишет: «На самом деле существует простое решение этой проблемы. После того, как вы спроектировали кросс-таблицу запроса, перейдите в режим конструирования внутри запроса и выберите« Итоги »в разделе« Записи »на вкладке« Главная ». Затем вы можете выбрать сумма или количество и т.д .... "

Переход в режим дизайна у меня не сработал:

  • Я выполнил запрос.
  • Затем перешли на вкладку Home
  • Выбранные итоги в разделе записей
  • Метка «Итоги» появилась в нижней части результатов запроса кросс-таблицы, но фактических итогов пока нет.
  • Кликнул по пустой ячейке справа от метки Итоги.
  • Появилась стрелка, и я выбрал "Сумма".

[Я использую Access 2013]

0 голосов
/ 06 октября 2015

Я тоже искал решение. Не удалось найти ни одного, кроме написания запроса на основе кросс-таблицы, а затем суммирования этого запроса и добавления в конец запроса объединения. Поскольку я пытаюсь выполнять все операторы 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
...