Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> VBA  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701925
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

新手来看:如何实现文字的sum?(修订)

作者:cg1  摘自:access911.net  :cg1  更新日期:2007-7-6  浏览人次:

 

问题:


如何通过 sql解决下列问题?
dq(地区)  xm(姓名)
A         张三
A         李四
B         王五
B         王六
B         王七
C         王九

我想做一个视图转换成
dq           xm
A           张三,李四
B           王五,王六,王七
C           王九

 

回答:

由于以下文章描述不够清晰

    新手来看:如何实现文字的sum? 
    http://access911.net/?kbid;77FABF1E13DC
 

已经在

    新手来看:如何实现文字的sum?(修订) 
    http://www.access911.net/?kbid;72FABE1E14DCE7F3

作了修订。上述两篇文章适用于 ACCESS 2000 至 ACCESS 2003 版本, ACCESS 2007 版本请参考:

    ACCESS2007如何利用“多值”实现文字的sum《表》
    http://access911.net/index.asp?u1=a&u2=72FABE1E16DCECF3

 


第一,这根本是一个错误的问题,请记住SQL的应用范围
第二,给你一个能够实现该问题的傻方法(不推荐)

在ACCESS模块里写函数
基本程序如下
'===========================================================
' 过程及函数名:  GetStrSum
' 版本号      :  2.0
' 说明        :  本函数作用:根据本示例要求将地区相同的姓名
'                 合并在一行中,并用逗号分隔。
'                 本函数只用于演示本示例,不具有可重用性,请
'                 在理解代码的基础上依实际环境作适当修改。
' 引用        :  DAO 3.5 及以上版本
' 输入参数    :  dq 文本,代表地区名称
' 输出值      :  --
' 返回值      :  文本,代表已经合并好的姓名
' 调用演示    :  GetStrSum("A")
'                 (或请直接看 查询_文字sum_DAO 查询。)
' 最后修改日期:  2007-7-6 22:22:00
' 示例地址    :  http://access911.net/?kbid;77FABF1E13DC
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Public Function GetStrSum(dq As String) As String  'dQ为社区名称
    Dim strNames As String      '声明一个文本变量
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    
    Set db = CurrentDb() '指定数据库为当前数据库
    Set rst = db.OpenRecordset("select * from 表A where dq='" + dq + "'") 
    '将对应地区“XM”表读入记录集

    Do Until rst.EOF
        strNames = strNames & "," & rst("xm").Value
        rst.MoveNext
    Loop

    If Left(strNames, 1) = "," Then
        strNames = Mid(strNames, 2)
    End If
    GetStrSum = strNames
    rst.Close
End Function


然后在SELECT语句直接调用
SELECT dq, GetStrSum(dq) AS xm FROM 表A GROUP BY DQ;

就行了

以下是调用 ADO 的:
Function test()
    Debug.Print StringSum_ADO("606NCT", "type", "incline", "10")
End Function

'===========================================================
' 过程及函数名:  StringSum_ADO
' 版本号      :  2.0
' 说明        :  本函数用于根据条件生成文字的 SUM
' 引用        :  DAO 3.5 及以上版本
' 输入参数    :  strTableName 文本,查询数据的表的名称
'                 strReturnFieldName 文本,返回值取值的字段,
'                         在本示例中就是 xm (姓名) 字段。
'                 strFieldName 可选,文本,合并文本的条件字段,
'                         本示例中指 dq (地区)字段,只有地区字
'                         段相同的才进行合并
'                 strValue 可选,文本,条件字段的具体值
'                         本示例中指 dq 字段的具体值,比如:A
'                 strDelimiter 可选,文本,分隔符,默认为逗号
' 输出值      :  --
' 返回值      :  文本,代表已经合并好的姓名
' 调用演示    :  StringSum_ADO("表A","xm","dq","A",",")
'                 (或请直接看 查询_文字sum_ADO 查询。)
' 最后修改日期:  2007-7-6 22:22:00
' 示例地址    :  http://access911.net/?kbid;77FABF1E13DC
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Public Function StringSum_ADO(ByVal strTableName As String, _
                          ByVal strReturnFieldName As String, _
                          Optional ByVal strFieldName As String, _
                          Optional ByVal strValue As String, _
                          Optional ByVal strDelimiter As String) As String
'本函数用于根据条件生成文字的 SUM

    Dim strA As String
    Dim Conn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Dim strSQL As String
    Set Conn = CurrentProject.Connection
    
    If strDelimiter = "" Then
        strDelimiter = ","
    End If
    If strFieldName <> "" And strValue <> "" Then
        If VBA.IsNumeric(strValue) = True Then
        '根据 strValue 是否数字自动进行判断,判断后再进行 SQL 的组织。
        '注意,这里不考虑 strValue 是否包含特殊字符,比如:单引号('),
        '请按照您的实际环境加以处理。

            strSQL = " Where " & strFieldName & "=" & strValue & ""
        Else
            strSQL = " Where " & strFieldName & "='" & strValue & "'"
        End If
    End If
    strSQL = "select * from " & strTableName & strSQL
    Debug.Print strSQL
    Rs.Open strSQL, Conn, 1, 1
    Do Until Rs.EOF
        strA = strA & Rs(strReturnFieldName) & strDelimiter
        Rs.MoveNext
    Loop
    Rs.Close
    StringSum_ADO = strA
End Function


示例下载:
http://access911.net/down/eg/eg_stringSum.rar
 (16KB)

 

方法二:

相关方法在adp(sql server)中也行得通
create function getstr(@content int)
returns varchar(2000)
as 
begin
declare @str varchar(2000)
set @str=''
select @str=@str+','+rtrim(字符列) from 你的表 where p_seq=@content
select @str=right(@str,len(@str)-1) where @str<>''
return @str
end
go

--调用:
select p_seq,dbo.getstr(p_seq) f0002,count(*) num1  from 你的表 group by p_seq


 


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     新手来看:如何实现文字的sum?
     如何合并多个表结构相同的MDB
     关于如何得到新增记录的自动编号字段数值方法三
     为什么ADP中明明源表15000条记录用select into生成新表却只有10000条了?
     如何任意记录上进行编辑,然后保存成一条新的记录,同时原记录没有发生改变
     新手来看:如何重复上一条记录?
     新手来看:如何获取recordset记录号?
     如何得知一个查询(update insert select)将改变或影响多少条记录?
     关于如何得到新增记录的自动编号字段数值方法二
     如何在表中新插入新记录后,获取该记录自动编号字段的值?
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利