ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

如何将Group by和Where写在一个SQL中,实现目标结果。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-3 11:57 | 显示全部楼层 |阅读模式

如何将Select Name,Count(Name)  From [Sheet1$C1:D18]  where Not Name is Null Group by Name
与Select Path  From [Sheet1$C1:D18]  where Name = 'B'
写在一个SQL中,实现目标结果。

image.png




  1. Sub ll()
  2.     Dim Str, Str1, SqlStr
  3.     Dim Rs As Recordset, Rs1 As Recordset
  4.     Dim Rng As Range, AddRng As Range
  5.         Set Rng = Selection
  6.     Dim Cc
  7.         Cc = 8
  8.         
  9.     Dim Sht As Worksheet
  10.         Set Sht = Rng.Parent
  11.         Debug.Print Sht.Cells(1, 1).Formula
  12.         Set AddRng = Sht.Range(Sht.Cells(1, 1).Formula)
  13.         Str = "Select Name,Count(Name)  From [" & Sht.Name & "$" & AddRng.Address(0, 0) & "]  where Not Name is Null Group by Name"
  14.         
  15.         Debug.Print Str
  16.         Set Rs = SqlRetuRs(Str)
  17.         '
  18.         Set Rng = Sht.Cells(3, Cc)
  19.         Rng.CopyFromRecordset Rs
  20.    
  21.         ''
  22.         With Rs
  23.             .MoveFirst
  24.             If .RecordCount > 1 Then
  25.                For ii = 0 To .RecordCount - 1
  26.                    Str = "Select Path  From [" & Sht.Name & "$" & AddRng.Address(0, 0) & "]  where Name = '" & .Fields(0) & "'"
  27.                    Debug.Print Str
  28.                   
  29.                    Set Rs1 = SqlRetuRs(Str)
  30.                    ''
  31.                     aa = Rs1.GetRows()
  32.                    With Application.WorksheetFunction
  33.                        Sht.Cells(3 + ii, Cc + 4).Resize(, Rs1.RecordCount) = .Transpose(.Transpose(aa))
  34.                    End With
  35.                   
  36.                    .MoveNext
  37.                Next ii
  38.             End If
  39.         End With
  40.         ''
  41.         
  42.         ''Stop

  43. End Sub


  44. Function SqlRetuRs(SqlStr)

  45.    Dim Cn As ADODB.Connection
  46.        Set Cn = New ADODB.Connection
  47.    Dim Rs As ADODB.Recordset
  48.        Set Rs = New ADODB.Recordset
  49.       
  50.         '
  51.        If InStr(UCase(Application.Path), "WPS") > 0 Then
  52.            Cn.Open "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';Data Source=" & ThisWorkbook.FullName
  53.        Else
  54.           Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';data source=" & ThisWorkbook.FullName
  55.        End If

  56.        Rs.Open SqlStr, Cn, adOpenKeyset, adLockOptimistic
  57.        Set SqlRetuRs = Rs
  58. End Function


复制代码


TA的精华主题

TA的得分主题

发表于 2024-6-3 13:52 来自手机 | 显示全部楼层

这种Excel sql比较难,可以试试sqlite
https://club.excelhome.net/forum.php?mod=viewthread&tid=1692500&fromguid=hot&extra=&mobile&_dsign=ae4c00b1

TA的精华主题

TA的得分主题

发表于 2024-6-3 14:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-3 14:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Select Name,Path,Count(Name)  From [Sheet1$C1:D18]  where Name = 'B' Group by Name,Path

TA的精华主题

TA的得分主题

发表于 2024-6-3 15:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
没上附件,不好评论,没准不需要SQL也可快速解决。

TA的精华主题

TA的得分主题

发表于 2024-6-4 21:05 | 显示全部楼层
比较笨 也比较直观的办法是: 嵌套
虽然对当前问题不是优秀解法

StrSQL="Select Path,Count(Name) AS 数量  From ("
StrSQL=StrSQL & "Select Name,Path  From [Sheet1$C1:D18]  where Not Name is Null "
StrSQL=StrSQL & ") AS A where Name = 'B'
StrSQL=StrSQL & " Group by Path"

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-12 03:30 | 显示全部楼层
opiona 发表于 2024-6-4 21:05
比较笨 也比较直观的办法是: 嵌套
虽然对当前问题不是优秀解法


谢谢你的思路,但没有使用好,目标没有实现实现。
image.png


采用循环法,是目标需求结果,但运行时间太长。需要进一步优化。

  1. Function SqlRetuRs(Str)

  2.    Dim Cn As ADODB.Connection
  3.        Set Cn = New ADODB.Connection
  4.    Dim Rs As ADODB.Recordset
  5.        Set Rs = New ADODB.Recordset
  6.       
  7.         '
  8.        If InStr(UCase(Application.Path), "WPS") > 0 Then
  9.            Cn.Open "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';Data Source=" & ThisWorkbook.FullName
  10.        Else
  11.           Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';data source=" & ThisWorkbook.FullName
  12.        End If
  13.        Rs.Open Str, Cn, adOpenKeyset, adLockOptimistic
  14.        Set SqlRetuRs = Rs
  15. End Function

  16. '''
  17. Sub ll2()
  18.    Dim Str
  19.    Dim Rng As Range, oRng As Range
  20.        Set Rng = Selection
  21.    Dim Sht As Worksheet
  22.        Set Sht = Rng.Parent
  23.        Set Rng = Sht.Range(Sht.Cells(7, 1).Formula)
  24.        Rng.Clear
  25.        Set Rng = Sht.Range(Sht.Cells(6, 1).Formula)
  26.        Debug.Print Rng.Address
  27.        Str = "Select Distinct oDate,Name,Count(Name) "
  28.        Str = Str & "From [Sheet1$J13:L54] "
  29.        Str = Str & "Where Not Name is Null Group by oDate,Name"
  30.        Debug.Print Str
  31.     Dim Rs As ADODB.Recordset, Rs1 As ADODB.Recordset
  32.        Set Rs = SqlRetuRs(Str)
  33.        Sht.Cells(15, 1).CopyFromRecordset Rs
  34.        '''
  35.        Rs.MoveFirst
  36.        For ii = 0 To Rs.RecordCount - 1
  37.             If Rs.Fields(2) > 1 Then
  38.                 Str = "Select Path  "
  39.                 Str = Str & "From [Sheet1$J13:L54] "
  40.                 Str = Str & "Where Name = '" & Rs.Fields(1) & "'"
  41.                 Debug.Print Str
  42.                 Set Rs1 = SqlRetuRs(Str)
  43.                 aa = Rs1.GetRows()
  44.                 Rs1.MoveFirst
  45.                 With WorksheetFunction
  46.                     Sht.Cells(15 + ii, 5).Resize(, Rs1.RecordCount) = .Transpose(.Transpose(Rs1.GetRows()))
  47.                 End With
  48.             End If
  49.             
  50.             Rs.MoveNext
  51.        Next ii
  52.       
  53. End Sub
复制代码



采用嵌套SQL没有实现。


  1. Sub ll()
  2.    Dim Str, oStr
  3.    Dim Rng As Range
  4.        Set Rng = Selection
  5.    Dim Sht As Worksheet
  6.        Set Sht = Rng.Parent
  7.        Set Rng = Sht.Range(Sht.Cells(7, 1).Formula)
  8.        Debug.Print Rng.Address

  9.        Rng.Clear
  10.       
  11.        Set Rng = Sht.Range(Sht.Cells(6, 1).Formula)
  12.        Debug.Print Rng.Address
  13.        SqlShtStr = Sht.Name & "$" & Rng.Address(0, 0)
  14.       
  15.        Dim Rs As ADODB.Recordset, Rs1 As ADODB.Recordset, Rs2 As ADODB.Recordset
  16.        Dim StrSql, StrSql1, StrSql2
  17.            StrSql1 = "Select Distinct Name From [" & SqlShtStr & "] Where Not Name is Null"
  18.            Set Rs1 = SqlRetuRs(StrSql1)
  19.            Debug.Print Rs1.RecordCount
  20.                

  21.            
  22.            ''
  23.            StrSql = "Select oDate,Name,Path,Count(Name)   From ("
  24.            StrSql = StrSql & "Select oDate,Name,Path,Count(Name)   From [" & SqlShtStr & "]  where Not Name is Null Group by oDate, Name,Path "
  25.            StrSql = StrSql & ") AS A where "
  26.            
  27.            Rs1.MoveFirst
  28.            oStr = "Name = '" & Rs1.Fields(0) & "'"
  29.            Rs1.MoveNext
  30.            For ii = 1 To Rs1.RecordCount - 1
  31.              oStr = oStr & " Or Name = '" & Rs1.Fields(0) & "'"
  32.              Rs1.MoveNext
  33.            Next ii
  34.            StrSql = StrSql & oStr & " Group by oDate,Name,Path"
  35.            Debug.Print StrSql

  36.    
  37.        Set Rs = SqlRetuRs(StrSql)
  38.        Sht.Cells(15, 1).CopyFromRecordset Rs
  39. End Sub

复制代码


A.zip

90.77 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2024-6-12 14:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ning84 发表于 2024-6-12 03:30
谢谢你的思路,但没有使用好,目标没有实现实现。

看下可以吗。

a.zip

29.58 KB, 下载次数: 8

评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

谢谢你的帮助。

学会了IIf(COUNT(Name) > 0, MAX(IIf(Path LIKE 'F:\%\%\%', Path, NULL)), NULL) 的应用。


        Str = "SELECT oDate, Name, COUNT(Name) AS Num, "
        Str = Str & "IIf(COUNT(Name) > 0, MAX(IIf(Path LIKE 'F:\%\%\%', Path, NULL)), NULL) AS Path, "
        Str = Str & "IIf(COUNT(Name) > 1, MAX(IIf(Path LIKE 'F:\%\%\%\%', Path, NULL)), NULL) AS Path1, "
        Str = Str & "IIf(COUNT(Name) > 2, MAX(IIf(Path LIKE 'F:\%\%\%\%\%', Path, NULL)), NULL) AS Path2, "
        Str = Str & "IIf(COUNT(Name) > 2, MAX(IIf(Path LIKE 'F:\%\%\%\%\%', Path, NULL)), NULL) AS Path3 "
        Str = Str & SqlShtStr
        Str = Str & "WHERE Name IS NOT NULL "
        Str = Str & "GROUP BY oDate, Name "
        Str = Str & "ORDER BY oDate, Name"


tmp1.zip

1.6 MB, 下载次数: 8

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

本版积分规则

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

GMT+8, 2024-11-17 13:19 , Processed in 0.035938 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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