ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 196|回复: 4

[求助] 动态行转列的求助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-7-10 23:20 | 显示全部楼层 |阅读模式
我从示例数据库(Oracle)查询获得了一个表格,我可以通过静态的方式用pivot去将行转换为列,请问怎么能实现动态转换呢?我的这个代码示例,仅仅能实现静态的转换,因为没有选择固定字段,所以用处不大,但是当固定字段减少的时候,用处就能体现出来。
我现在遇到的问题有一下几点,希望有大神能够帮忙一下,不胜感激。


1. 第一行的 * 的字段名称,分为固定字段和动态字段,我希望能通过变量实现,但是现在遇到一个问题,就是当字符串为'Accounting' AS "Accounting" 这样的时候,怎么使用转义字符,因为在IN 函数里面,'Accounting’是对的,但是Accounting就不行,如果不加AS “Accounting”呢,又会遇到字段名称里面有单引号。
2. 如何实现一个这样的赋值:
    a. dynamic_col:= SELECT DISTINCT td.department_name FROM departments td;
    b. fixed_col:='regions','country','city';
3. 我看见网上有一些关于动态行列转换的讲解,比如PIVOT XML....,还有一些使用过程的,遗憾还是没能成功。光赋值就把我难住了。

附件“动态行转列” 是我已经查询出来之后的表格
附件“HR” 则是所有可能在查询中会涉及到的表格

   SELECT * FROM (
      SELECT te.employee_id AS eid,
        CONCAT(te.first_name,CONCAT(' ',te.last_name)) AS fullname,
        te.email,
        td.department_name AS dept,
        te.job_id,
        tj.job_title,
        tj.min_salary,
        tj.max_salary,
        tr.region_name AS regions,
        tl.country_id,
        tc.country_name AS country,
        tl.city,
        te.hire_date,te.salary,
        (CASE WHEN salary< tj.min_salary THEN 'Low'
          WHEN salary>tj.max_salary THEN 'High'
          ELSE 'Normal' END) AS salevaluation
      FROM employees te
      LEFT JOIN departments td ON te.department_id=td.department_id
      LEFT JOIN jobs tj ON te.job_id=tj.job_id
      LEFT JOIN locations tl ON td.location_id=tl.location_id
      LEFT JOIN countries tc ON tl.country_id=tc.country_id
      LEFT JOIN regions tr ON tc.region_id=tr.region_id
    WHERE te.employee_id IS NOT NULL)
    PIVOT (AVG(salary) FOR dept IN ('Accounting' AS "Accounting",'Administration' AS "Administration",
        'Benefits' AS "Benefits",'Construction' AS "Construction",'Contracting' AS "Contracting",
        'Control And Credit' AS "Control And Credit",'Corporate Tax' AS "Corporate Tax",'Executive' AS "Executive",
        'Finance' AS "Finance",'Government Sales' AS "Government Sales",'Human Resources' AS "Human Resources",
        'IT' AS "IT",'IT Helpdesk' AS "IT Helpdesk",'IT Support' AS "IT Support",'Manufacturing' AS "Manufacturing",
        'Marketing' AS "Marketing",'NOC' AS "NOC",'Operations' AS "Operations",'Payroll' AS "Payroll",
        'Public Relations' AS "Public Relations",'Purchasing' AS "Purchasing",'Recruiting' AS "Recruiting",
        'Retail Sales' AS "Retail Sales",'Sales' AS "Sales",'Shareholder Services' AS "Shareholder Services",
        'Shipping' AS "Shipping",'Treasury' AS "Treasury"))
  ORDER by eid;

HR.7z

52.66 KB, 下载次数: 4

动态行转列.7z

17.19 KB, 下载次数: 4

查询后

TA的精华主题

TA的得分主题

发表于 2023-7-11 09:13 来自手机 | 显示全部楼层
没看明白啥意思,能否模拟一下结果 提供一下原始数据

https://club.excelhome.net/forum.php?mod=viewthread&tid=1667363&page=1&#pid11289628
如果sql无法实现,可以看看这个

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-11 20:48 | 显示全部楼层
2个附件,一个为从SQL查询出来的数据,另外一个是所有相关表的数据。
其实EXCEL里面是通过数据透视表是比较容易实现的,但是因为数据量比较大(1个月大约30W行),所以我想在SQL里面查询数据的同时就实现这个功能。

我希望把动态行转列这个附件里面的表的数据,将dept这个字段里面的值,比如“IT..“,作为一个新的字段,并以IT..命名,然后求salary的平均值

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-11 20:51 | 显示全部楼层
zpy2 发表于 2023-7-11 09:13
没看明白啥意思,能否模拟一下结果 提供一下原始数据

https://club.excelhome.net/forum.php?mod=viewth ...

谢谢,我去拜读了这个作者的文章,他做了一个关于转置很好的示例,遗憾并不是我想要的。

TA的精华主题

TA的得分主题

发表于 2023-7-17 15:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
参考下这个  ,
https://www.cnblogs.com/itjeff/p/6394808.html
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 22:48 , Processed in 0.038225 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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