TRANSFORM 语句 (Microsoft Access SQL)

适用于:Access 2013、Office 2013

创建交叉表查询。

语法

TRANSFORM aggfunctionselectstatement PIVOT pivotfield [IN (value1[, value2[, ...]]) ]

TRANSFORM 语句包含以下部分:

Part

说明

aggfunction

对所选数据进行计算的 SQL 聚合函数

selectstatement

SELECT 语句。

pivotfield

希望用于创建查询结果集中列标题的字段或表达式。

value1, value2

用于创建列标题的固定值。

说明

使用交叉表查询汇总数据时,将从作为列标题的指定字段或表达式中选择值,以便能够以一种比使用选择查询更紧凑的方式来查看数据。

TRANSFORM 是可选的,但包含 时是 SQL 字符串中的第一个语句。 它位于 SELECT 语句之前,该语句指定用作行标题的字段和指定行分组的 GROUP BY 子句。 (可选)可以包括指定其他选择或排序条件的其他子句,例如 WHERE。 还可以在交叉表查询中使用子查询作为谓词(特别是 WHERE 子句中的谓词)。

pivotfield 中返回的值作为查询结果集中的列标题。 例如,在交叉表查询中如果依据月销售量来透视销售数据,将会创建 12 个列。 可以约束 pivotfield 以便从可选 IN 子句中所列出的固定值(value1value2)内选择标题。 也可以包含固定值用于没有数据来创建其他列的情况。

示例

以下示例使用 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