热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mssql2005如何实现类似GROUP_CONCAT(my-sql)的功能

有一表结构如下流水号企业ID订单日期订单号112008-01-01no00001212008-01
有一表结构如下

流水号  企业ID  订单日期         订单号
1         1    2008-01-01    no00001
2         1    2008-01-01    no00002
3         1    2008-01-01    no00003
4         1    2008-01-01    no00004
5         2    2008-01-01    no00005
6         2    2008-01-01    no00006
--------------------
要求如下做成如下效果(按日期和企业ID汇总)

企业ID  订单日期         订单号                                   订单数量
1         2008-01-01   no00001;no00002;no00003;no00004      4
2         2008-01-01   no00005;no00006                      2
--------------------------

请问要如何做呢
请教各位

7 个解决方案

#1


问题描述:
无论是在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
            ), '', ''), 1, 1, '')
)N

/*--结果
id          values
----------- ----------------
1           aa,bb
2           aaa,bbb,ccc
(2 行受影响)
--*/

CSDN 社区帖子地址 

附: 合并与分拆的CLR, sql2005的示例中有:
在安装sql 2005的示例后,默认安装目录为
drive:\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中

#2


如果是二个字段都要这样汇总呢


还有就是如何汇总订单数量呢

#3


动下脑袋呗~

#4


2楼真强,for xml auto 真是好用

#5


--> --> (Andy)生成测试数据 2008-08-20
Set Nocount On
declare @1 table([流水号] int,[企业ID] int,[订单日期] Datetime,[订单号] nvarchar(7))
Insert @1
select 1,1,'2008-01-01',N'no00001' union all
select 2,1,'2008-01-01',N'no00002' union all
select 3,1,'2008-01-01',N'no00003' union all
select 4,1,'2008-01-01',N'no00004' union all
select 5,2,'2008-01-01',N'no00005' union all
select 6,2,'2008-01-01',N'no00006'

Select [企业ID],[订单日期],[订单号],[订单数量] 
From (Select [企业ID],[订单日期],[订单数量]=Count(*) 
From @1 
Group By [企业ID],[订单日期]) a
Outer Apply(Select [订单号]=Stuff((Select ','+[订单号] 
From @1 
Where [企业ID]=a.[企业ID] And [订单日期]=a.[订单日期] For Xml Path('')
),1,1,'')
) p

/*
企业ID        订单日期                    订单号 订单数量
-----------------------------------------------------------------------------
1 2008-01-01 00:00:00.000 no00001,no00002,no00003,no00004 4
2 2008-01-01 00:00:00.000 no00005,no00006 2
*/

#6


引用 5 楼 DVD_01 的回复:
Select [企业ID],[订单日期],[订单号],[订单数量] 
From (Select [企业ID],[订单日期],[订单数量]=Count(*) 
From @1 
Group By [企业ID],[订单日期]) a 
Outer Apply(Select [订单号]=Stuff((Select ','+[订单号] 
From @1 
Where [企业ID]=a.[企业ID] And [订单日期]=a.[订单日期] For Xml Path('') 
),1,1,'') 
) p 

非常谢谢你的回答,谢谢!
再想问一下,如果除了[订单号]还有一个[票据号]也需要作这样的处理,
Outer Apply(Select [订单号]=Stuff((Select ','+[订单号] 
From @1 
Where [企业ID]=a.[企业ID] And [订单日期]=a.[订单日期] For Xml Path('') 
),1,1,'') 
) p 
这句话应该如何修改,我改了几次都提示出错,不清楚格式是如何的,可否再请教

#7


已完美解决,谢谢楼主各位

谢谢

------------------------------
但是这种查询不能变成视图,如果想将结果保留起来进行第二次查询的话要如何做呢




推荐阅读
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
author-avatar
不铃不铃铃不铃铃铃
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有