Инструкция TRANSFORM (Microsoft Access SQL)
Область применения: Access 2013, Office 2013
Создает перекрестный запрос.
Синтаксис
Сводное поле TRANSFORM aggfunctionselectstatement PIVOT [IN (value1[, value2[, ...]]])]
Инструкция TRANSFORM состоит из следующих элементов:
Часть |
Описание |
---|---|
агрегатная_функция |
Агрегатная функция SQL, обрабатывающая выбранные данные. |
инструкция_select |
Инструкция SELECT. |
поле_сводной_таблицы |
Поле или выражение, которое нужно использовать для создания заголовков столбцов в наборе результатов запроса. |
значение1, значение2 |
Фиксированные значения, используемые для создания заголовков столбцов. |
Примечания
При суммировании данных с помощью перекрестного запроса значения выбираются из указанных полей или выражений, например из заголовков столбцов. Таким образом, данные отображаются в более сжатом формате, чем при использовании запроса на выборку.
Инструкция TRANSFORM является необязательной, но если она используется, она должна быть первой инструкцией в строке SQL. Она предшествует инструкции SELECT, в которой задаются поля, используемые в качестве заголовков строк, и предложению GROUP BY, определяющему группировку строк. При необходимости вы можете добавить другие предложения, например WHERE, чтобы задать дополнительные условия выбора или сортировки. В перекрестном запросе также можно использовать вложенные запросы в качестве предикатов, например в предложении WHERE.
Значения, возвращаемые полем_сводной_таблицы, используются в качестве заголовков столбцов в результирующем наборе записей. Например, при сведении данных объемов продаж и месяца продажи в перекрестном запросе будет создано 12 столбцов. Вы можете ограничить действие поля_сводной_таблицы и создать заголовки, используя фиксированные значения (значение1, значение2), указанные в необязательном предложении IN. Чтобы создать дополнительные столбцы, можно ввести фиксированные значения, для которых не существует данных.
Пример
В этом примере используется предложение SQL TRANSFORM, чтобы создать перекрестный запрос, показывающий количество заказов, принятых каждым сотрудником, за каждый календарный квартал 1994 года. Для запуска этой процедуры необходима функция SQLTRANSFORMOutput.
Sub TransformX1()
Dim dbs As Database
Dim strSQL As String
Dim qdfTRANSFORM As QueryDef
strSQL = "PARAMETERS prmYear SHORT; TRANSFORM " _
& "Count(OrderID) " _
& "SELECT FirstName & "" "" & LastName AS " _
& "FullName FROM Employees INNER JOIN Orders " _
& "ON Employees.EmployeeID = " _
& "Orders.EmployeeID WHERE DatePart " _
& "(""yyyy"", OrderDate) = [prmYear] "
strSQL = strSQL & "GROUP BY FirstName & " _
& """ "" & LastName " _
& "ORDER BY FirstName & "" "" & LastName " _
& "PIVOT DatePart(""q"", OrderDate)"
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
Set qdfTRANSFORM = dbs.CreateQueryDef _
("", strSQL)
SQLTRANSFORMOutput qdfTRANSFORM, 1994
dbs.Close
End Sub
В этом примере используется предложение SQL TRANSFORM, чтобы создать немного более сложный перекрестный запрос, показывающий общую сумму (в долларах) заказов, принятых каждым сотрудником, за каждый календарный квартал 1994 года. Для запуска этой процедуры необходима функция SQLTRANSFORMOutput.
Sub TransformX2()
Dim dbs As Database
Dim strSQL As String
Dim qdfTRANSFORM As QueryDef
strSQL = "PARAMETERS prmYear SMALLINT; TRANSFORM " _
& "Sum(Subtotal) SELECT FirstName & "" """ _
& "& LastName AS FullName " _
& "FROM Employees INNER JOIN " _
& "(Orders INNER JOIN [Order Subtotals] " _
& "ON Orders.OrderID = " _
& "[Order Subtotals].OrderID) " _
& "ON Employees.EmployeeID = " _
& "Orders.EmployeeID WHERE DatePart" _
& "(""yyyy"", OrderDate) = [prmYear] "
strSQL = strSQL & "GROUP BY FirstName & "" """ _
& "& LastName " _
& "ORDER BY FirstName & "" "" & LastName " _
& "PIVOT DatePart(""q"",OrderDate)"
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
Set qdfTRANSFORM = dbs.CreateQueryDef _
("", strSQL)
SQLTRANSFORMOutput qdfTRANSFORM, 1994
dbs.Close
End Sub
Function SQLTRANSFORMOutput(qdfTemp As QueryDef, _
intYear As Integer)
Dim rstTRANSFORM As Recordset
Dim fldLoop As Field
Dim booFirst As Boolean
qdfTemp.PARAMETERS!prmYear = intYear
Set rstTRANSFORM = qdfTemp.OpenRecordset()
Debug.Print qdfTemp.SQL
Debug.Print
Debug.Print , , "Quarter"
With rstTRANSFORM
booFirst = True
For Each fldLoop In .Fields
If booFirst = True Then
Debug.Print fldLoop.Name
Debug.Print , ;
booFirst = False
Else
Debug.Print , fldLoop.Name;
End If
Next fldLoop
Debug.Print
Do While Not .EOF
booFirst = True
For Each fldLoop In .Fields
If booFirst = True Then
Debug.Print fldLoop
Debug.Print , ;
booFirst = False
Else
Debug.Print , fldLoop;
End If
Next fldLoop
Debug.Print
.MoveNext
Loop
End With
End Function