- •Выборка данных
- •Оператор select
- •Выражения sql
- •Выражение from
- •Операции left join, right join
- •Операция inner join
- •Выражение in
- •Предикаты all, distinct, distinctrow, top
- •Объявление with owneraccess option
- •Выражение where
- •Операция Like
- •Операция In
- •Операция Between...And
- •Подзапрос
- •Выражение order by
- •Выражение group by
- •Выражение having
- •Оператор union
- •Оператор transform
- •Выражение procedure
- •Объявление parameters
- •Изменение данных
- •Оператор update
- •Оператор insert into
- •Оператор delete
- •Изменение структуры
- •Оператор select...Into
- •Оператор create table3
- •Выражение constraint4
- •Оператор alter table5
- •Оператор create index6
- •Оператор drop7
- •Агрегатные функции
- •Функция Count
- •Функция Avg
- •Функция Sum
- •Функции Var и VarP
- •Функции StDev и StDevP
- •Функции Min, Max
- •Функции First, Last
Оператор transform
Создает перекрестный запрос. Формат
TRANSFORM aggfunction selectstatement PIVOT pivotfield [IN (value1[, value2[, ...]])]
Оператор TRANSFORM имеет следующие части:
Часть |
Описание |
aggfunction |
Агрегатная функция, обрабатывающая выбранные данные |
selectstatement |
Оператор SELECT |
pivotfield |
Имя поля или выражение, используемое для заголовков столбцов |
value1, value2 |
Постоянные – заголовки столбцов |
Перекрестный запрос представляет данные в более компактном виде, чем обычный, позволяя указать имя поля или выражение, используемое в качестве заголовков столбцов. TRANSFORM не обязательно, но если указано, должно быть первым в строке запроса. Оно предшествует оператору SELECT, указывающему поля, используемые в качестве названий строк, и выражению GROUP BY, указывающему способ группировки строк. Можно включать другие выражения, например WHERE, для указания критериев отбора и сортировки. Можно также использовать подзапросы в выражении WHERE.
Значения, возвращаемые в pivotfield, используются как заголовки столбцов в результирующем запросе. Например, использование названия месяца в качестве pivotfield приведет к запросу с двенадцатью столбцами. Можно ограничить число столбцов, создав заголовки из набора констант, перечисленных в выражении IN (значения, не входящие в набор, будут отфильтрованы).
В следующем примере используется для создания перекрестного запроса поквартального числа заказов для каждого служащего за 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
Несколько усложненный вариант – стоимость заказов:
Sub TransformX2()
Dim dbs As Database
Dim strSQL As String
Dim qdfTRANSFORM As QueryDef
strSQL = "PARAMETERS prmYear SHORT; 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
Следующие примеры можно ввести в SQL-окне конструктора запросов:
Помесячный объем продаж. Месяцы – названия столбцов, товары – названия строк
PARAMETERS [Sales for which year?] LONG;
TRANSFORM Sum([Order Details].Quantity * ([Order Details].UnitPrice - ([Order Details].Discount / 100) * [Order Details].UnitPrice)) AS Sales
SELECT ProductName FROM Orders INNER JOIN (Products INNER JOIN [Order Details] ON Products.ProductID = [Order Details].ProductID) ON Orders.OrderID = [Order Details].OrderID WHERE DatePart("yyyy", OrderDate) = [Sales for which year?] GROUP BY ProductName ORDER BY ProductName
PIVOT DatePart("m", OrderDate);
Поквартальный объем продаж. Кварталы – названия столбцов, поставщики – названия строк
PARAMETERS [Sales for which year?] LONG;
TRANSFORM Sum([Order Details].Quantity * ([Order Details].UnitPrice - ([Order Details].Discount / 100) * [Order Details].UnitPrice)) AS Sales
SELECT CompanyName FROM Orders INNER JOIN ((Suppliers INNER JOIN Products ON Suppliers.SupplierID = Products.SupplierID) INNER JOIN [Order Details] ON Products.ProductID = [Order Details].ProductID) ON Orders.OrderID = [Order Details].OrderID WHERE DatePart("yyyy", OrderDate) = [Sales for which year?] GROUP BY CompanyName ORDER BY CompanyName
PIVOT "Qtr " & DatePart("q", OrderDate) In ('Qtr 1', 'Qtr 2', 'Qtr 3', 'Qtr 4');
