Transform и Pivot в Access 2016 - PullRequest
       1

Transform и Pivot в Access 2016

0 голосов
/ 29 октября 2018

Я знаю, что есть темы по этому вопросу, но все примеры идут в обратном направлении от того, что мне нужно сделать.

У меня есть данные в Access 2016, которые выглядят так:

Source Data

И мне нужно повернуть его вертикально, чтобы оно выглядело так:

Preferred Output

Etc. Столбец ID студента никогда не меняется, но количество вопросов меняется, поэтому я думаю, что это должен быть какой-то цикл до конца записи.

Powerquery делает это легко в Excel, но мне нужно, чтобы он был нативным в доступе.

В качестве альтернативы, если кто-то может объяснить, как это сделать TRANSFORM и PIVOT в Access 2013 SQL в обратном направлении, я могу завершить его оттуда.

Обычный поворот и отключение не справятся с этим, потому что мне нужно перенести заголовок столбца как поле данных И мне нужно, чтобы он зациклился на этом движении до конца записи и не будет точно знать, сколько столбцы там будут каждый раз. Поэтому один раз файл может перейти в Q07, а другой - в Q43.

Мой уровень квалификации с доступом - любительский. Я могу сделать достаточно VBA для копирования и изменения кода, но недостаточно для записи этого в Access.

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Сначала я попробовал это.

SELECT StudentID, [Questionnaire #] as QuestionnaireID, 'Q01' as Question, [Q01] as Response FROM Random_data_generator UNION ALL
SELECT StudentID, [Questionnaire #] as QuestionnaireID, 'Q02' as Question, [Q02] as Response FROM Random_data_generator UNION ALL
SELECT StudentID, [Questionnaire #] as QuestionnaireID, 'Q03' as Question, [Q03] as Response FROM Random_data_generator UNION ALL
SELECT StudentID, [Questionnaire #] as QuestionnaireID, 'Q04' as Question, [Q04] as Response FROM Random_data_generator UNION ALL
SELECT StudentID, [Questionnaire #] as QuestionnaireID, 'Q05' as Question, [Q05] as Response FROM Random_data_generator UNION ALL
SELECT StudentID, [Questionnaire #] as QuestionnaireID, 'Q06' as Question, [Q06] as Response FROM Random_data_generator UNION ALL
SELECT StudentID, [Questionnaire #] as QuestionnaireID, 'Q07' as Question, [Q07] as Response FROM Random_data_generator
ORDER BY StudentID, Question;

Но я не мог понять, как сделать это динамически для случайного числа ответов. Поэтому я сдул пыль со своих книг на VB и в итоге получил то, что, я уверен, плохо закодировано и заставит людей вздрогнуть. Но работает.

Dim db As DAO.Database
Set db = CurrentDb
Dim qdf As DAO.QueryDef

ColumnCount = CurrentDb.TableDefs("Random_data_generator").Fields.Count
ColumnCount2 = ColumnCount - 2
Dim QueryString As String
Dim QueryEntry As String
Dim counter As Integer
Dim counterEntry As String
Dim QueryTest As Recordset
Dim QuestionnaireNum As String
counter = 1


Do While counter <= ColumnCount2

 counterEntry = Format(counter, "00")

    QueryString = "SELECT StudentID, [QuestionnaireNum] as QuestionnaireID, 'Q" & counterEntry & "' as Question, [Q" & counterEntry & "] as Response FROM Random_data_generator UNION ALL " & vbCrLf
    counter = counter + 1
    QueryEntry = QueryEntry + QueryString

 Loop

 counterEntry = Format(counter, "00")

 QueryString = "SELECT StudentID, [QuestionnaireNum] as QuestionnaireID, 'Q" & counterEntry & "' as Question, [Q" & counterEntry & "] as Response FROM Random_data_generator ORDER BY StudentID, Question;"
 QueryEntry = QueryEntry + QueryString

 On Error Resume Next
 DoCmd.DeleteObject acQuery, "tempQry"
 On Error GoTo 0

 Set qdf = db.CreateQueryDef("tempQry", QueryEntry)

 DoCmd.OpenQuery ("tempQry")
0 голосов
/ 29 октября 2018

Вы просто используете union all:

select studentId, 'Q01' as question, q01 as response
from data
union all
select studentId, 'Q02' as question, q02 as response
from data
union all
. . .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...