ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 EH云课堂直播课程免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 175|回复: 12

[求助] 【SQL查询】vba如何通过SQL计算每一行的数值占比?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-2-13 12:03 | 显示全部楼层 |阅读模式
【疑问】请教大神,想求每个客户的收入占总收入之比,并且是运用vba中的SQL查询提取数据出来,要怎么操作呢?eg:检测业务收入占所有业务收入的占比、检测业务收入中的A、B、C...客户占检测业务收入的占比,如图(详见附件)




360截图20200213115758943.jpg

SQL查询占比.7z

21.64 KB, 下载次数: 8

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-13 12:04 | 显示全部楼层
忘记附上代码了,如下:(错的,要改,不清楚怎么改)

Sub test()


    Dim cnn As Object, SQL$
    Set cnn = CreateObject("adodb.connection")
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName

Data = "科目名称,本期借方发生额,本年借方累计,本年借方累计/max(本年借方累计)"

Table = "[辅助项目核算科目余额表$a1:k5]"
      
      case1 = "科目代码 like '1122%'"
      case2 = "本年借方累计 > 0 "
         
      SQL = "select " & Data & " from " & Table & _
      "where (" & case1 & " and " & case2 & ") " & _
      "group by 本年借方累计,本期借方发生额,科目名称 order by 本年借方累计 DESC, 科目名称 DESC"

   
      Sheets("收入明细").Cells(6, 2).CopyFromRecordset cnn.Execute(SQL)

End Sub

TA的精华主题

TA的得分主题

发表于 2020-2-13 12:37 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-13 15:55 | 显示全部楼层
cui26896 发表于 2020-2-13 12:37
一头雾水,不懂财务,10000是从哪里来的,看不懂。

应收账款那一行的10000只是随意写的,理论上会在“辅助项目核算科目余额表”中反映出来。此处为方便而已,不用考虑该数字从哪里来

TA的精华主题

TA的得分主题

发表于 2020-2-13 16:13 | 显示全部楼层
stevefigo 发表于 2020-2-13 15:55
应收账款那一行的10000只是随意写的,理论上会在“辅助项目核算科目余额表”中反映出来。此处为方便而已 ...

如果该数与要取数所在表的聚合相关,不可能不考虑。这里要求是用SQL,不是靠数组循环。

TA的精华主题

TA的得分主题

发表于 2020-2-13 17:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-13 17:15 | 显示全部楼层
加一个数组计算一下:
  1. Sub test()
  2.     Dim cnn As Object, SQL$, i%, arr
  3.     Set cnn = CreateObject("adodb.connection")
  4.     cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
  5.     Data = "科目名称,本期借方发生额,本年借方累计,本年借方累计/max(本年借方累计)"
  6.     Table = "[辅助项目核算科目余额表$a1:k5]"
  7.     case1 = "科目代码 like '1122%'"
  8.     case2 = "本年借方累计 > 0 "
  9.     SQL = "select " & Data & " from " & Table & _
  10.     "where (" & case1 & " and " & case2 & ") " & _
  11.     "group by 本年借方累计,本期借方发生额,科目名称 order by 本年借方累计 DESC, 科目名称 DESC"
  12.     arr = cnn.Execute(SQL).GetRows
  13.     For i = 1 To UBound(arr, 2)
  14.         arr(3, i) = arr(2, i) / arr(2, 0)
  15.     Next
  16.     Sheets("收入明细").[B6].Resize(UBound(arr), 4) = Application.Transpose(arr)
  17.     Sheets("收入明细").Cells(6, 5) = Sheets("收入明细").Cells(6, 4) / Sheets("收入明细").Cells(5, 4)
  18. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2020-2-13 17:16 | 显示全部楼层
  1. Sub test()


  2.     Dim cnn As Object, SQL$
  3.     Set cnn = CreateObject("adodb.connection")
  4.     cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName

  5.     Data = "科目名称,sum(本期借方发生额),sum(本年借方累计),sum(本年借方累计)/sum(本年借方累计)"

  6.     Table = "[辅助项目核算科目余额表$a1:k5]"
  7.       
  8.       case1 = "科目代码 like '1122%'"
  9.       case2 = "本年借方累计 > 0 "
  10.          
  11.       SQL = "select " & Data & " from " & Table & _
  12.       "where (" & case1 & " and " & case2 & ") " & _
  13.       "group by 科目名称 order by sum(本年借方累计) DESC, 科目名称 DESC"

  14.    
  15.       Sheets("收入明细").Cells(6, 2).CopyFromRecordset cnn.Execute(SQL)

  16. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-2-13 17:30 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-13 17:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,高效办公专列,每天发车

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

GMT+8, 2020-2-17 05:56 , Processed in 0.381356 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

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

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

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