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?uec=bg&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, 陳格 保留所有權利