Access多行数据合并成一行(同列多行数据合并成一行)数据用逗号隔开
- 2017-08-17 21:00:00
- zstmtony 原创
- 20408
'用途,将同客户合同号同样的模具号 的不同颜色合并到一个字段里
合并前的数据
'客合同 款号 颜色 数量
'A 9001 黑色 100
'A 9001 白色 200
'A 9001 红色 300
'
'
'不用ADO 或DAO ,用查询,大家有什么比较好的办法 显示为:
'
合并后的效果
'客合同号 款号 颜色 数量
'A 9001 黑色,白色,红色 600
合并前查询截图:
合并后截图:
完整源代码如下:
Private Sub cmdCombineColor_Click() Dim rs As New ADODB.Recordset Dim rsDes As New ADODB.Recordset Dim strKeyNo As String Dim strStyleNo As String CurrentDb.Execute "delete * from tbl客户合同款号汇总表 " rsDes.Open "select * from tbl客户合同款号汇总表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic rs.Open "select * from qry客户合同款号颜色汇总", CurrentProject.Connection, adOpenKeyset, adLockOptimistic Do While Not rs.EOF '如果同样的客合同号 同样的模具号(款号),则将颜色合并在一起 If strKeyNo = rs("客合同号") & "-" & rs("模具号") Then rsDes("颜色") = rsDes("颜色") & "," & rs("颜色") rsDes("订单总数") = Nz(rsDes("订单总数"), 0) + Nz(rs("订单总数"), 0) Else '新的客合同号+模具号(款号),则创建一条新的记录 strKeyNo = rs("客合同号") & "-" & rs("模具号") rsDes.AddNew rsDes("客户") = rs("客户") rsDes("客户名称") = rs("客户名称") rsDes("客合同号") = rs("客合同号") rsDes("合同日期") = rs("合同日期") rsDes("模具号") = rs("模具号") rsDes("类别") = rs("类别") rsDes("颜色") = rs("颜色") rsDes("订单总数") = Nz(rs("订单总数"), 0) End If rsDes.Update rs.MoveNext Loop rs.Close rsDes.Close DoCmd.OpenTable "tbl客户合同款号汇总表", , acReadOnly End Sub
其它参考资料:
------------------------------多行字段合并到一行上的SQL语句写法----------------------------------
在开发过程中经常碰到要实现按照某一字段,将其它字段中不同的值连接后显示到一行上的需求。
本人总结了一下两种方法:
CREATE TABLE dept(DEPTID int,ENAME varchar(20 BYTE),SEX varchar(20 BYTE),AGE varchar(20 BYTE));
insert into dept values(1,'张三','F','18');
insert into dept values(1,'李四','F','19');
insert into dept values(1,'王五','F','20');
insert into dept values(2,'刘六','M','21');
insert into dept values(2,'赵七','M','22');
insert into dept values(2,'曹九','M','23');
commit;
select * from dept
--第一种写法:
SELECT DISTINCT FIRST_VALUE(deptid) OVER(PARTITION BY deptid ORDER BY lv DESC) AS deptid,
FIRST_VALUE(ename) OVER(PARTITION BY deptid ORDER BY lv DESC) AS ename
FROM (SELECT deptid, SYS_CONNECT_BY_PATH(ename, ' ') ename, LEVEL lv
FROM (SELECT deptid,ename,LAG(ename, 1, NULL) OVER(PARTITION BY deptid ORDER BY ename) ename_1
FROM (SELECT deptid, ename FROM dept))
CONNECT BY PRIOR ename = ename_1
ORDER BY deptid, ename)
--Oracle中sys_connect_by_path函数用法:主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示
--其中connect by是oracle中一种特有按层次递归用法,PRIOR表示上一条记录,CONNECT BY PRIOR ename=ename_1是说上一条记录的ename是本条记录的ename_1,即本记录的父亲是上一条记录。
--level是一个伪列
--结果如下:
--1 | 李四 王五 张三
--2 | 曹九 刘六 赵七
--改进后可以增加一列如下:
SELECT DISTINCT FIRST_VALUE (deptid) OVER (PARTITION BY deptid ORDER BY lv DESC) AS deptid,
FIRST_VALUE (sex) OVER (PARTITION BY sex ORDER BY lv DESC) AS sex,
FIRST_VALUE (ename) OVER (PARTITION BY deptid ORDER BY lv DESC) AS ename
FROM (SELECT deptid, sex, SYS_CONNECT_BY_PATH (ename, ' ') ename, LEVEL lv
FROM (SELECT deptid, ename, sex,
LAG (ename, 1, NULL) OVER (PARTITION BY deptid ORDER BY ename) ename_1
FROM (SELECT deptid, ename, sex FROM dept))
CONNECT BY PRIOR ename = ename_1
ORDER BY deptid)
--结果如下:
--1 |F | 李四 王五 张三
--2 |M | 曹九 刘六 赵七
--第二种写法:
SELECT deptid,SYS_CONNECT_BY_PATH(ename, ' ') AS ename,sex,SYS_CONNECT_BY_PATH(age, ' ') AS age
FROM (SELECT deptid,ename,sex,age,
RANK() OVER(ORDER BY deptid)+ROW_NUMBER() OVER(ORDER BY deptid) rn,
ROW_NUMBER() OVER(PARTITION BY deptid ORDER BY deptid) rm
FROM dept) a1
WHERE a1.ROWID IN (SELECT MAX(a2.ROWID) FROM dept a2 WHERE a2.deptid = a1.deptid)
START WITH rm = 1
CONNECT BY PRIOR rn = rn - 1
--结果如下:
--1| 张三 李四 王五|F| 18 19 20
--2| 刘六 赵七 曹九|M| 21 22 23
SQL查询多行合并到一行
问题描述:
无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
所以,当我们在处理下列要求时,会比较麻烦:
有表tb, 如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即, group by id, 求 value 的和(字符串相加)
1. 旧的解决方法
-- 1. 创建处理函数
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value
FROM tb
WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO
-- 调用函数
SELECt id, values=dbo.f_str(id)
FROM tb
GROUP BY id
-- 2. 新的解决方法
-- 示例数据
DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'
-- 查询处理
SELECT *
FROM(
SELECT DISTINCT
id
FROM @t
)A
OUTER APPLY(
SELECT
[values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM @t N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N
/*--结果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
--*/
- office课程播放地址及课程明细
- Excel Word PPT Access VBA等Office技巧学习平台
- 将( .accdb) 文件格式数据库转换为早期版本(.mdb)的文件格式
- 将早期的数据库文件格式(.mdb)转换为 (.accdb) 文件格式
- KB5002984:配置 Jet Red Database Engine 数据库引擎和访问连接引擎以阻止对远程数据库的访问(remote table)
- Access 365 /Access 2019 数据库中哪些函数功能和属性被沙箱模式阻止(如未启动宏时)
- Access Runtime(运行时)最全的下载(2007 2010 2013 2016 2019 Access 365)
- Activex控件或Dll 在某些电脑无法正常注册的解决办法(regsvr32注册时卡住)
- office使用部分控件时提示“您没有使用该ActiveX控件许可的问题”的解决方法
- RTF文件(富文本格式)的一些解析
- Access树控件(treeview) 64位Office下出现横向滚动条不会自动定位的解决办法
- Access中国树控件 在win10电脑 节点行间距太小的解决办法
- EXCEL 2019 64位版(Office 2019 64位)早就支持64位Treeview 树控件 ListView列表等64位MSCOMMCTL.OCX控件下载
- VBA或VB6调用WebService(直接Post方式)并解析返回的XML
- 早期PB程序连接Sqlserver出现错误
- MMC 不能打开文件C:/Program Files/Microsoft SQL Server/80/Tools/Binn/SQL Server Enterprise Manager.MSC 可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版
- sql server连接不了的解决办法
- localhost与127.0.0.1区别
- Roych的浅谈数据库开发系列(Sql Server)
- sqlserver 自动备份对备份目录没有存取权限的解决办法
- 安装Sql server 2005 express 和SQLServer2005 Express版企业管理器 SQLServer2005_SSMSEE
联系人: | 王先生 |
---|---|
Email: | 18449932@qq.com |
QQ: | 18449932 |
微博: | officecn01 |