Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4014|回复: 13

[已解决]SQL双条件求解决

[复制链接]
发表于 2014-3-1 19:20 | 显示全部楼层 |阅读模式
本帖最后由 张雄友 于 2014-3-1 22:07 编辑

前几天发现SQL 中的威力很大,请帮解决附件重复劳动问题。
最佳答案
2014-3-1 20:00
  1. Option Explicit
  2. Dim AdoConn As Object
  3. Dim AdoRst As Object
  4. Dim AdoRst1 As Object
  5. Const adUseClient = 3
  6. Const adModeRead = 1

  7. Sub test()
  8.     Dim i As Integer
  9.     Call OpenConnect(ThisWorkbook.FullName)
  10.     Set AdoRst = AdoConn.Execute("select  车间,组别,count(工号) as 计数,sum(收入) as 总收入,avg(收入) as 平均收入 from [明细$a1:f] group by 车间,组别")
  11.     With AdoRst
  12.         For i = 0 To AdoRst.Fields.Count - 1
  13.             Sheet1.Cells(1, i + 1).Value = AdoRst.Fields(i).Name
  14.         Next
  15.     End With
  16.     Sheet1.Range("a2").CopyFromRecordset AdoRst
  17. End Sub
  18. Function OpenConnect(strFullname) As Boolean
  19.     Dim StrConn$

  20.     On Error GoTo ErrorHandler
  21.     If AdoConn Is Nothing Then
  22.         Set AdoConn = CreateObject("ADODB.Connection")
  23.     Else
  24.         OpenConnect = True
  25.         Exit Function
  26.     End If

  27.     StrConn = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
  28.               "Data Source='" & strFullname & "';;Extended Properties='Excel 8.0;HDR=YES;imex=1';"
  29.     With AdoConn
  30.         .CursorLocation = adUseClient
  31.         .Mode = adModeRead
  32.         .ConnectionString = StrConn
  33.         .Open
  34.     End With

  35.     OpenConnect = True
  36.     Exit Function

  37. ErrorHandler:
  38.     On Error Resume Next
  39.     MsgBox Err.Number & vbCrLf & _
  40.            Err.Description
  41.     Set AdoRst = Nothing
  42.     Set AdoConn = Nothing

  43. End Function
复制代码

SQL双条件求解决.rar

19.26 KB, 下载次数: 4

发表于 2014-3-1 19:55 | 显示全部楼层
  1. select  车间,组别,count(工号),sum(收入),avg(收入) from [明细$a1:f] group by 车间,组别
复制代码

评分

参与人数 1 +3 收起 理由
张雄友 + 3 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-3-1 19:56 | 显示全部楼层
hwc2ycy 发表于 2014-3-1 19:55

最后那个总数与平均数没有提取出来的?
回复

使用道具 举报

发表于 2014-3-1 20:00 | 显示全部楼层    本楼为最佳答案   
  1. Option Explicit
  2. Dim AdoConn As Object
  3. Dim AdoRst As Object
  4. Dim AdoRst1 As Object
  5. Const adUseClient = 3
  6. Const adModeRead = 1

  7. Sub test()
  8.     Dim i As Integer
  9.     Call OpenConnect(ThisWorkbook.FullName)
  10.     Set AdoRst = AdoConn.Execute("select  车间,组别,count(工号) as 计数,sum(收入) as 总收入,avg(收入) as 平均收入 from [明细$a1:f] group by 车间,组别")
  11.     With AdoRst
  12.         For i = 0 To AdoRst.Fields.Count - 1
  13.             Sheet1.Cells(1, i + 1).Value = AdoRst.Fields(i).Name
  14.         Next
  15.     End With
  16.     Sheet1.Range("a2").CopyFromRecordset AdoRst
  17. End Sub
  18. Function OpenConnect(strFullname) As Boolean
  19.     Dim StrConn$

  20.     On Error GoTo ErrorHandler
  21.     If AdoConn Is Nothing Then
  22.         Set AdoConn = CreateObject("ADODB.Connection")
  23.     Else
  24.         OpenConnect = True
  25.         Exit Function
  26.     End If

  27.     StrConn = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
  28.               "Data Source='" & strFullname & "';;Extended Properties='Excel 8.0;HDR=YES;imex=1';"
  29.     With AdoConn
  30.         .CursorLocation = adUseClient
  31.         .Mode = adModeRead
  32.         .ConnectionString = StrConn
  33.         .Open
  34.     End With

  35.     OpenConnect = True
  36.     Exit Function

  37. ErrorHandler:
  38.     On Error Resume Next
  39.     MsgBox Err.Number & vbCrLf & _
  40.            Err.Description
  41.     Set AdoRst = Nothing
  42.     Set AdoConn = Nothing

  43. End Function
复制代码

评分

参与人数 1 +3 收起 理由
张雄友 + 3 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-3-1 20:05 | 显示全部楼层
hwc2ycy 发表于 2014-3-1 20:00

最后那个总数与平均数没有提取出来的?
回复

使用道具 举报

发表于 2014-3-1 20:58 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, brr, w(1 To 3), d, i&, x$, s&, rng As Range
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Sheet2.Range("a1").CurrentRegion
  5. ReDim brr(1 To UBound(arr), 1 To 5)
  6. For i = 2 To UBound(arr)
  7.     x = arr(i, 1) & "," & arr(i, 2)
  8.     If Not d.exists(x) Then
  9.         s = s + 1
  10.         d(x) = s
  11.         brr(s, 1) = arr(i, 1)
  12.         brr(s, 2) = arr(i, 2)
  13.         brr(s, 3) = 1
  14.         brr(s, 4) = arr(i, 5)
  15.     Else
  16.         brr(d(x), 3) = brr(d(x), 3) + 1
  17.         brr(d(x), 4) = brr(d(x), 4) + arr(i, 5)
  18.     End If
  19. Next
  20. For i = 1 To s
  21.     brr(i, 5) = brr(i, 4) / brr(i, 3)
  22.     For j = 1 To 2
  23.         w(j) = w(j) + brr(i, j + 2)
  24.     Next
  25.     w(3) = w(2) / w(1)
  26. Next
  27. Sheet1.Activate
  28. [l:p].Clear
  29. Range("l3").Resize(1, UBound(brr, 2)) = Array("车间", "组别", "计数项:组", "收入", "平均收入")
  30. Range("l4").Resize(s, 5) = brr
  31. [l3].CurrentRegion.Sort Key1:=[l4], Key2:=[m4], Header:=xlGuess
  32. Set rng = Range("l4").Offset(s, 0)
  33. rng = "总计": rng.Resize(1, 3).Offset(, 2) = w
  34. rng.Resize(1, 2).Merge
  35. With [l3].CurrentRegion.Borders()
  36.     .LineStyle = xlContinuous
  37.     .Weight = xlThin
  38. End With
  39. End Sub
复制代码
常规写法

评分

参与人数 1 +3 收起 理由
张雄友 + 3 很给力!

查看全部评分

回复

使用道具 举报

发表于 2014-3-1 21:41 | 显示全部楼层
张雄友 发表于 2014-3-1 20:05
最后那个总数与平均数没有提取出来的?

你没测试代码看结果,不是有嘛。


回复

使用道具 举报

 楼主| 发表于 2014-3-1 21:47 | 显示全部楼层
hwc2ycy 发表于 2014-3-1 21:41
你没测试代码看结果,不是有嘛。

总计 
808
312046
386


这个数哦?
回复

使用道具 举报

发表于 2014-3-1 21:53 | 显示全部楼层
张雄友 发表于 2014-3-1 21:47
这个数哦?

你昨天是不是也发过一个类似的贴子, 当时也是用SQL解决的。


回复

使用道具 举报

 楼主| 发表于 2014-3-1 21:56 | 显示全部楼层
hwc2ycy 发表于 2014-3-1 21:53
你昨天是不是也发过一个类似的贴子, 当时也是用SQL解决的。

请看附件。

SQL双条件求解决.rar

24.61 KB, 下载次数: 4

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 08:33 , Processed in 0.375881 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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