+ -
当前位置:首页 → 问答吧 → 数据库字符串连接和数字统计问题,比较难一点。求大虾帮忙

数据库字符串连接和数字统计问题,比较难一点。求大虾帮忙

时间:2011-12-01

来源:互联网

现有数据库如下
AA BB CC DD
1 F01 12 15
2 F01 16 18
3 F02 19 21
4 F03 22 25
5 F01 26 28
6 F03 29 31

需要得到如下结果:
EE为:需要分类的数据。
FF为:每行的数据DD-CC+1,然后所有相同的进行统计。
GG为:每行CC-DD,然后连接其他相同的数据。

EE FF GG
F01 10 12-15/16-18/26-28
F02 3 19-21
F03 7 22-25/29-31


以上为调用access数据库,需要用sql语句得出结果。

如有结果,马上结贴。

作者: smallrain97   发布时间: 2011-12-01

你要统计什么?相除吗?

作者: qianjin036a   发布时间: 2011-12-01

SQL code
select EE=BB,
       FF=sum(DD-CC+1),
       GG=SUM(CC-DD)
FROMgroup by BB

作者: ssp2009   发布时间: 2011-12-01

12-15/16-18/26-28
这个结果是什么?就是这么个字符串吗?

作者: qianjin036a   发布时间: 2011-12-01

SQL code

--只会前两个列,最后一个列好像得写VB函数
select 
      ee=bb,
      ff=sum(dd-cc+1)
from tb
group by bb

作者: pengxuan   发布时间: 2011-12-01

在网上找到的
--------------------------------------------------------------------------------------------------------------
模块中定义函数:
Public Function GroupConcat(sColumn As String, sTable As String, Optional sCriteria As String, Optional sDelimiter As String = ",")
  On Error GoTo ErrHandler
  Dim rs As New ADODB.Recordset
  Dim sSQL As String
  Dim sResult As String
  sResult = ""
  sSQL = "select " & sColumn & " from " & sTable
  If sCriteria <> "" Then
  sSQL = sSQL & " where " & sCriteria
  End If
  rs.Open sSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
  Do While Not rs.EOF
  If sResult <> "" Then
  sResult = sResult & sDelimiter
  End If
  sResult = sResult & rs.Fields(0).Value
  rs.MoveNext
  Loop
  rs.Close
  Set rs = Nothing
  GroupConcat = sResult
  Exit Function
ErrHandler:
  If rs.State <> adStateClosed Then
  rs.Close
  End If
  Set rs = Nothing
  GroupConcat = Err.Number & " : " & Err.Description
   
   
End Function
---------------------------------------------------------------------------------------
定义表T_Person_Course并插入数据:
编号 Name Course
1 张乐 语文
2 张乐 数学
3 张乐 英语
4 张乐 历史
5 朴正南 韩语
6 朴正南 汉语
7 欧阳南 计算机
8 欧阳南 农牧
9 欧阳南 音乐
-------------------------------------------------------------
查看每个人的主修科目:
SELECT T_Person_Course.Name, GroupConcat('Course','T_Person_Course','Name=' & "'" & Name & "'") AS Courses
FROM T_Person_Course
GROUP BY name;
--------------------------------------------------------------
执行结果:
Name Courses
欧阳南 计算机,农牧,音乐
朴正南 韩语,汉语
张乐 语文,数学,英语,历史
----------------------------------------------------------

作者: pengxuan   发布时间: 2011-12-01

EE为:需要分类的数据。
FF为:每行的数据DD-CC+1,然后所有相同的进行统计。
GG为:把每个数字转换为字符串,然后组合起来,格式就是CC-DD/CC-DD这样的。

作者: smallrain97   发布时间: 2011-12-01

引用 3 楼 qianjin036a 的回复:
12-15/16-18/26-28
这个结果是什么?就是这么个字符串吗?


恩,就是把数字转换为字符串,连接在一起。

作者: smallrain97   发布时间: 2011-12-01

引用 5 楼 pengxuan 的回复:
在网上找到的
--------------------------------------------------------------------------------------------------------------
模块中定义函数:
Public Function GroupConcat(sColumn As String, sTable As String, Optio……


这个只是进行单一的统计,因为数据为数字,还要把相同的数字进行计算。

作者: smallrain97   发布时间: 2011-12-01

后面的这个连接要用循环,在ACCESS里用一句语句没办法获得结果.要用VBA来做.
上面的那个函数值得借鉴,对于数据连接只要用 cstr()函数来转为字符就能借用上面的函数了.

作者: qianjin036a   发布时间: 2011-12-01

这个用mssql容易实现,你的access,建议去其他数据库问问吧。

作者: ssp2009   发布时间: 2011-12-01

获得结果后,再与只计算和的语句连接可得结果.

作者: qianjin036a   发布时间: 2011-12-01

引用 11 楼 qianjin036a 的回复:
获得结果后,再与只计算和的语句连接可得结果.


刚开始学习,比较菜的,能够给个参考么,谢了的先。

作者: smallrain97   发布时间: 2011-12-01

这个是用delphi软件编写的软件,调用的acess数据库,所以看能不能用sql语句得到这个结果。

作者: smallrain97   发布时间: 2011-12-01

SQL code
建表及插入记录
create table tb(AA int,BB varchar(10),CC int,DD int)
insert into tb(aa,bb,cc,dd) select 1,'F01',12,15
insert into tb(aa,bb,cc,dd) select 2,'F01',16,18
insert into tb(aa,bb,cc,dd) select 3,'F02',19,21
insert into tb(aa,bb,cc,dd) select 4,'F03',22,25
insert into tb(aa,bb,cc,dd) select 5,'F01',26,28
insert into tb(aa,bb,cc,dd) select 6,'F03',29,31
go
新建模块,输入下列程序:
Option Compare Database

Public Function GroupConcat(sColumn As String)
  Dim rs As New ADODB.Recordset
  Dim sSQL As String
  Dim sResult As String
  sResult = ""
  sSQL = "select cc,dd from tb where bb=""" & sColumn & """"
  rs.Open sSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
  Do While Not rs.EOF
  If sResult <> "" Then
  sResult = sResult & "/"
  End If
  sResult = sResult & CStr(rs.Fields(0).Value) & "-" & CStr(rs.Fields(1).Value)
  rs.MoveNext
  Loop
  rs.Close
  Set rs = Nothing
  GroupConcat = sResult
End Function

新建查询,在SQL窗口输入下列查询语句:
SELECT tb.BB,sum(DD-CC+1) as FF,GroupConcat(bb) AS GG
FROM tb
GROUP BY tb.BB;go
drop table tb

查询结果
BB    FF    GG
F01    10    12-15/16-18/26-28
F02    3    19-21
F03    7    22-25/29-31

作者: qianjin036a   发布时间: 2011-12-01

引用 13 楼 smallrain97 的回复:
这个是用delphi软件编写的软件,调用的acess数据库,所以看能不能用sql语句得到这个结果。


函数建在ACCESS模块里,上面的查询语句由delphi直接拼写并执行就行了.

作者: qianjin036a   发布时间: 2011-12-01

引用 10 楼 ssp2009 的回复:

这个用mssql容易实现,你的access,建议去其他数据库问问吧。

  我看了下晴天的回复。请问在sql server中是不是也要写函数?

作者: down_login   发布时间: 2011-12-01