ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 利用Power query(PQ)+SQL server从多个用友数据库取数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-11 22:39 | 显示全部楼层 |阅读模式
本帖最后由 lizhiman2005 于 2017-3-12 21:56 编辑

本人从事财务工作,是某公司的财务总监。由于本科学的是计算机,研究生读的是会计专业,所以对编程、SQL有浓厚的兴趣,当然,计算机专业知识由于过于久远,基本忘得差不多了。因此现在能够用上的就是VBA,SQL了。
之前曾经写过一篇帖子是用SQL来汇总多工作簿数据的。随着科技的发展,微软为我们提供了越来越强大的功能,比如Power BI。

现在工作中每月必须从用友取很多数据,而且还是多账套的,从客户端计算运算效率极低,包括用友的UFO报表等。由此萌发了从服务器直接取数,每月刷新数据来代替UFO报表以及进行必要的财务分析。
目前国内还没有系统的中文PQ书籍,亚马逊网站的几本书全部是国外进口的,我也没有精力去阅读那么多外文内容。在此要感谢张文洲的帖子,本文借鉴了张兄的某些帖子内容,结合自己在实际工作中的运用,希望能给论坛里的朋友们以启发。现进入正题:


需要的知识技能:
1. SQL 语言;
2. 数据透视表,切片器等
3.EXCEL 2016的PQ功能;
4. 要有自己公司的用友服务器登录密码,一般用户名是sa,密码要问自己公司的IT;
5.要清楚知道用友对应版本的数据字典。

最终的计算结果:

利用透视表的切片器功能,随意点选某公司、某年度、月份的科目余额表,进而生成利润表。由于数据是公司的服务器数据,不方便上传EXCEL文件。



代码见下:
let
    A_GS_accsum = Sql.Database("172.16.2.16", "UFDATA_588_2012", [Query="select 'A' as '公司',ccode,iyear,iperiod,md from GL_accsum where iyear>=2014 and ccode>='5001'"]), 解释:从服务器选择某账套,紧接着是SQL查询语言,从表GL_accsum取四个字段,并且在前边加一个字段“”公司“”,后边是用友的数据字典。
    B_GS_accsum = Sql.Database("172.16.2.16", "UFDATA_888_2012", [Query="select 'B' as '公司',ccode,iyear,iperiod,md from GL_accsum where iyear>=2014 and ccode>='5001'"]),
    C_GS_accsum = Sql.Database("172.16.2.16", "UFDATA_188_2013", [Query="select 'C' as '公司',ccode,iyear,iperiod,md from GL_accsum where iyear>=2014 and ccode>='6001'"]),
    Append_accsum=Table.Combine({#"A_GS_accsum", #"B_GS_accsum", #"C_GS_accsum"}),将三个公司账套数据追加查询
    A_GS_code = Sql.Database("172.16.2.16", "UFDATA_588_2012", [Query="select 'A' as '公司',ccode,ccode_name from code code where ccode>='5001'"]),
    B_GS_code = Sql.Database("172.16.2.16", "UFDATA_888_2012", [Query="select 'B' as '公司',ccode,ccode_name from code code where ccode>='5001'"]),
    C_GS_code = Sql.Database("172.16.2.16", "UFDATA_188_2013", [Query="select 'C' as '公司',ccode,ccode_name from code code where ccode>='6001'"]),
    Append_code=Table.Combine({#"A_GS_code", #"B_GS_code", #"C_GS_code"}),追加查询
    Combine_accsum_code=Table.NestedJoin(#"Append_accsum",{"公司","ccode"},#"Append_code",{"公司","ccode"},"NewColumn",JoinKind.RightOuter),合并查询,按照两个表的字段“公司“”和“Ccode”来做合并,合并有四种方式,可按需选择。
    #"展开的“NewColumn”" = Table.ExpandTableColumn(Combine_accsum_code, "NewColumn", {"ccode_name"}, {"NewColumn.ccode_name"}),
    删除的副本 = Table.Distinct(#"展开的“NewColumn”"),
    重排序的列 = Table.ReorderColumns(删除的副本,{"公司", "iyear", "iperiod", "ccode", "NewColumn.ccode_name", "md"}),
    重命名的列 = Table.RenameColumns(重排序的列,{{"iyear", "年度"}, {"iperiod", "期间"}, {"ccode", "科目编码"}, {"NewColumn.ccode_name", "科目名称"}, {"md", "金额"}}),
    筛选的行1 = Table.SelectRows(重命名的列, each ([公司] <> null)),
    添加的后缀 = Table.TransformColumns(筛选的行1, {{"年度", each Text.From(_, "zh-CN") & "年", type text}}),
    添加的后缀1 = Table.TransformColumns(添加的后缀, {{"期间", each Text.From(_, "zh-CN") & "月", type text}})
in
    添加的后缀1



录像3_转.rar

1.68 MB, 下载次数: 461

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-5-4 11:03 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-7-24 11:19 | 显示全部楼层
收藏了,希望大神多多分享干货。

TA的精华主题

TA的得分主题

发表于 2018-6-24 15:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个太强大了。只有懂的人才会由衷地赞叹

TA的精华主题

TA的得分主题

发表于 2019-1-7 15:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-1-7 20:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
PQ简直是神器!!!!

TA的精华主题

TA的得分主题

发表于 2019-1-7 21:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-8-11 17:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢老师分享,正好需要用到。

TA的精华主题

TA的得分主题

发表于 2022-5-31 22:07 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-6-1 00:05 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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