ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: livewire

[分享] 【SQL】浅谈如何学习TRANSFORM/ PIVOT语句?

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2010-8-28 22:09 | 显示全部楼层
谢谢!慢慢啃

TA的精华主题

TA的得分主题

发表于 2010-9-22 10:19 | 显示全部楼层
[quote]原帖由 livewire 于 2010-3-17 17:28 发表
先来看看这个语句做什么用?语法怎样?

TRANSFORM 语句
创建交叉表查询Creates a crosstab query .

语法
TRANSFORM aggfunction
selectstatement
PIVOT pivotfield ])]
其中的aggfunction , 聚合函数的参数相当于拖到数据透视表数据区域的值字段。使用的聚合函数即值字段的汇总方式
其中的selectstatement , 相当于数据透视表的行字段. ,
其中的 pivotfield 相当于数据透视表的列字段,后面的IN (value1[, value2[, ...]])],相当列字段中的项的排序和筛选
只要摆弄过数据透视表,将transform/pivot语句与数据透视表对照,掌握这个MS JET新增SQL语句不在话下
谢谢!学习了!!

TA的精华主题

TA的得分主题

发表于 2010-11-4 14:20 | 显示全部楼层
原帖由 livewire 于 2010-3-27 12:11 发表
经验证, UNION[ALL]运算返回的结果集中的字段名(列标题)是以第一个SELECT查询的字段名(列标题)为准。

所以原语句中带下划线的第2个 AS TableNo 可取消。

TRANSFORM sum(t1.数量)
SELECT  t1.型号 FROM ( ...

我用UNION[ALL]的频率非常高,每次都写重复的别名,很麻烦,这次好了,省了不少麻烦

TA的精华主题

TA的得分主题

发表于 2010-11-5 11:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
虽然一头雾水~学习了~

TA的精华主题

TA的得分主题

发表于 2010-12-21 08:17 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-2-6 20:27 | 显示全部楼层
谢谢分享!我是来学习的,留个记号。

TA的精华主题

TA的得分主题

发表于 2011-4-12 12:45 | 显示全部楼层
真是好东西,消化消化。谢谢楼主总结!

TA的精华主题

TA的得分主题

发表于 2011-6-5 16:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
记得当时看Microsoft Jet SQL参考上介绍TRANSFORM语句时:
TRANSFORM 语句
创建连接查询.

语法
TRANSFORM合计函数
    selectstatement
    TRANSFORM aggfunction
selectstatement
PIVOT pivotfield [IN (value1[, value2[, ...]])]

TRANSFORM 语句可分为以下几个部分:

部分 说明
aggfunction 运算所选数据的 SQL合计函数  
selectstatement SELECT 语句.
pivotfield 在查询结果集中用来创建列标题的字段或表达式。
value1,value2 用来创建列标题的固定值。

说明
使用交叉表查询来摘要数据时,从指定的字段或表达式中选定值作为列标题,这样,可以用比选定查询更紧凑的格式来观察数据。

TRANSFORM是可选的,但当被包含时为 SQL字符串的第一句。它出现在 SELECT 语句(指定作为行标题的字段的)之前,还出现在 GROUP BY 子句(指定行分组的)之前。可以有选择地包含其它子句,例如 WHERE 子句,它指定附加的选择或排序条件。也可以将子查询当作谓词,特别是在叉表查询的 WHERE 子句中。

pivotfield 返回的值被用作查询结果集中的列标题。例如,在交叉表查询中,将根据销售图表按销售月份创建 12 个列。可以限制 pivotfield 用列在可选的 IN 子句中的固定值(value1, value2)来创建标题。也可以用没有数据存在的固定值来创建附加的列。

请参阅
FROM 子句 (Microsoft Jet SQL) SELECT 语句 (Microsoft Jet SQL)
GROUP BY 子句 (Microsoft Jet SQL) SQL 合计函数(SQL)
INNER JOIN 运算 (Microsoft Jet SQL) SQL子查询
ORDER BY 子句 (Microsoft Jet SQL) WHERE 子句 (Microsoft Jet SQL)

看了几遍仍是一头雾水,即使有下面的示例:
TRANSFORM 语句示例
此示例使用 SQL TRANSFORM 子句创建交叉表查询显示 1994 年每一季每位员工所接的订单的数目。 该 SQLTRANSFORMOutput 函数对此过程的完成是必须的。
SubSub()
    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)"
    ' 在您的计算机中修改此行使其正确指到 Northwind 的路径。
    Set dbs = OpenDatabase("Northwind.mdb")
    ' 对运费超过 $100 的订单,
    Set qdfTRANSFORM = dbs.CreateQueryDef _
        ("", strSQL)
    SQLTRANSFORMOutput qdfTRANSFORM, 1994
     dbs.Close
End Sub
此示例使用 SQL TRANSFORM 子句创建一个稍微复杂的交叉表查询,来显示出每位员工在 1994 年所接订单的总金额。
SubSub()
    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)"        
    ' 在您的计算机中修改此行使其正确指到 Northwind 的路径。
    Set dbs = OpenDatabase("Northwind.mdb")
    ' 对运费超过 $100 的订单,
    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
也是知其然不知其所以然,始终不能自主、灵活运用。期待有人结合具体实例,详细讲解讲解?

TA的精华主题

TA的得分主题

发表于 2011-6-10 14:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复 1楼 livewire 的帖子

谢谢楼主 怎么添加到我收藏

TA的精华主题

TA的得分主题

发表于 2011-6-23 20:41 | 显示全部楼层

回复 29楼 望天打卦 的帖子

点击1楼的右上角 收藏 按钮 即可
12.GIF
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 14:54 , Processed in 0.047020 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表