Инструкция 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