Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
327.17 Кб
Скачать

Оператор 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-окне конструктора запросов:

  1. Помесячный объем продаж. Месяцы – названия столбцов, товары – названия строк

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);

  1. Поквартальный объем продаж. Кварталы – названия столбцов, поставщики – названия строк

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');

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]