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

smallrain97 2011-12-01 10:09:06
现有数据库如下
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语句得出结果。

如有结果,马上结贴。
...全文
120 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mkxiaoqiang123456 2011-12-02
  • 打赏
  • 举报
回复
--创建函数
CREATE FUNCTION getList ( @BB VARCHAR(100) )
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @s VARCHAR(100) ;
SET @s = '' ;

SELECT @s = @s + ( CONVERT(VARCHAR(10), cc) + '-'
+ CONVERT(VARCHAR(10), DD) + '/' )
FROM T
WHERE BB = @BB

RETURN SUBSTRING(@s,1,LEN(@s)-1)

END


--查询
SELECT *
FROM ( SELECT AA ,
BB AS EE ,
SUM(DD - CC + 1) OVER ( PARTITION BY BB ) AS FF ,
dbo.getList(BB) AS GG
FROM T
) AS a
WHERE a.AA IN ( SELECT TOP 1
AA
FROM dbo.T
WHERE BB = a.EE )
mkxiaoqiang123456 2011-12-02
  • 打赏
  • 举报
回复
建议写个函数
-晴天 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 down_login 的回复:]

引用 10 楼 ssp2009 的回复:

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

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

可以用函数,也可以用公用表达式做递归来实现.
好人吗 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ssp2009 的回复:]

这个用mssql容易实现,你的access,建议去其他数据库问问吧。
[/Quote]
我看了下晴天的回复。请问在sql server中是不是也要写函数?
-晴天 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 smallrain97 的回复:]
这个是用delphi软件编写的软件,调用的acess数据库,所以看能不能用sql语句得到这个结果。
[/Quote]

函数建在ACCESS模块里,上面的查询语句由delphi直接拼写并执行就行了.
-晴天 2011-12-01
  • 打赏
  • 举报
回复
建表及插入记录
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
smallrain97 2011-12-01
  • 打赏
  • 举报
回复
这个是用delphi软件编写的软件,调用的acess数据库,所以看能不能用sql语句得到这个结果。
smallrain97 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qianjin036a 的回复:]
获得结果后,再与只计算和的语句连接可得结果.
[/Quote]

刚开始学习,比较菜的,能够给个参考么,谢了的先。
-晴天 2011-12-01
  • 打赏
  • 举报
回复
获得结果后,再与只计算和的语句连接可得结果.
快溜 2011-12-01
  • 打赏
  • 举报
回复
这个用mssql容易实现,你的access,建议去其他数据库问问吧。
-晴天 2011-12-01
  • 打赏
  • 举报
回复
后面的这个连接要用循环,在ACCESS里用一句语句没办法获得结果.要用VBA来做.
上面的那个函数值得借鉴,对于数据连接只要用 cstr()函数来转为字符就能借用上面的函数了.
smallrain97 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengxuan 的回复:]
在网上找到的
--------------------------------------------------------------------------------------------------------------
模块中定义函数:
Public Function GroupConcat(sColumn As String, sTable As String, Optio……
[/Quote]

这个只是进行单一的统计,因为数据为数字,还要把相同的数字进行计算。
smallrain97 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qianjin036a 的回复:]
12-15/16-18/26-28
这个结果是什么?就是这么个字符串吗?
[/Quote]

恩,就是把数字转换为字符串,连接在一起。
smallrain97 2011-12-01
  • 打赏
  • 举报
回复
EE为:需要分类的数据。
FF为:每行的数据DD-CC+1,然后所有相同的进行统计。
GG为:把每个数字转换为字符串,然后组合起来,格式就是CC-DD/CC-DD这样的。
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
  • 打赏
  • 举报
回复

--只会前两个列,最后一个列好像得写VB函数
select
ee=bb,
ff=sum(dd-cc+1)
from tb
group by bb
-晴天 2011-12-01
  • 打赏
  • 举报
回复
12-15/16-18/26-28
这个结果是什么?就是这么个字符串吗?
快溜 2011-12-01
  • 打赏
  • 举报
回复
select EE=BB,
FF=sum(DD-CC+1),
GG=SUM(CC-DD)
FROM 表 group by BB
-晴天 2011-12-01
  • 打赏
  • 举报
回复
你要统计什么?相除吗?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧