[SQL]合并字符串
--带符号合并行列转换 --有表t,其数据如下:
/*
a b
1 1
1 2
1 3
2 1
2 2
3 1
--如何转换成如下结果:
a b
1 1,2,3
2 1,2
3 1
*/
drop table tb
create table tb
(
a int,
b int
)
insert into tb(a,b) values(,)
insert into tb(a,b) values(,)
insert into tb(a,b) values(,)
insert into tb(a,b) values(,)
insert into tb(a,b) values(,)
insert into tb(a,b) values(,)
go if object_id('pubs..f_hb') is not null
drop function f_hb
go --创建一个合并的函数
create function f_hb(@a int)
returns varchar()
as
begin
declare @str varchar()
set @str = ''
select @str = @str + ',' + cast(b as varchar) from tb where a = @a
set @str = right(@str , len(@str) - )
return(@str)
End
go --调用自定义函数得到结果:
select distinct a ,dbo.f_hb(a) as b from tb drop table tb --结果
/*
a b
----------- ------
1 1,2,3
2 1,2
3 1 (所影响的行数为 3 行)
*/ /*
多个前列的合并
数据的原始状态如下:
ID PR CON OP SC
001 p c 差 6
001 p c 好 2
001 p c 一般 4
002 w e 差 8
002 w e 好 7
002 w e 一般 1
===========================
用SQL语句实现,变成如下的数据
ID PR CON OPS
001 p c 差(6),好(2),一般(4)
002 w e 差(8),好(7),一般(1)
*/ if object_id('pubs..tb') is not null
drop table tb
go create table tb
(
id varchar(),
pr varchar(),
con varchar(),
op varchar(),
sc int
) insert into tb(ID,PR,CON,OP,SC) values('', 'p', 'c', '差', )
insert into tb(ID,PR,CON,OP,SC) values('', 'p', 'c', '好', )
insert into tb(ID,PR,CON,OP,SC) values('', 'p', 'c', '一般', )
insert into tb(ID,PR,CON,OP,SC) values('', 'w', 'e', '差', )
insert into tb(ID,PR,CON,OP,SC) values('', 'w', 'e', '好', )
insert into tb(ID,PR,CON,OP,SC) values('', 'w', 'e', '一般', )
go if object_id('pubs..test') is not null
drop table test
go
select ID,PR,CON , OPS = op + '(' + cast(sc as varchar()) + ')' into test from tb --创建一个合并的函数
if object_id('pubs..f_hb') is not null
drop function f_hb
go
create function f_hb(@id varchar(),@pr varchar(),@con varchar())
returns varchar()
as
begin
declare @str varchar()
set @str = ''
select @str = @str + ',' + cast(OPS as varchar) from test where id = @id and @pr = pr and @con = con
set @str = right(@str , len(@str) - )
return(@str)
End
go --调用自定义函数得到结果:
select distinct id ,pr , con , dbo.f_hb(id,pr,con) as OPS from test drop table tb
drop table test --结果
/*
id pr con OPS
---------- ---------- ---------- -------------------
001 p c 差(6),好(2),一般(4)
002 w e 差(8),好(7),一般(1) (所影响的行数为 2 行)
*/ if object_id('pubs..b') is not null
drop table b
go
create table b
(col varchar()) insert b values ('a')
insert b values ('b')
insert b values ('c')
insert b values ('d')
insert b values ('e') declare @sql varchar()
set @sql=''
select @sql=@sql+b.col+',' from (select col from b) as b
set @sql='select '''+@sql+''''
exec(@sql) --解答二
create table A(SID int, F1 int, F2 int)
insert into A values(, , )
insert into A values(, , )
insert into A values(, , ) create table B(BID int, SID int, T int, V int)
insert into B values(, , , )
insert into B values(, , , )
insert into B values(, , , )
insert into B values(, , , )
insert into B values(, , , )
insert into B values(, , , )
go --静态SQL,即t的值固定为1,
select sid,f1,f2,
max(case when t = then v else end) v1,
max(case when t = then v else end) v2
from
(
select a.*,b.t,b.v from a,b where a.sid = b.sid
) t
group by sid,f1,f2 --动态sql,即T的值不固定
declare @sql varchar()
set @sql = 'select SID , F1 , F2'
select @sql = @sql + ' , sum(case t when ''' + cast(t as varchar) + ''' then v else 0 end) [V' + cast(t as varchar) + ']'
from (select distinct t from (select a.sid,a.f1,a.f2,b.t,b.v from a,b where a.sid = b.sid) m) as a
set @sql = @sql + ' from (select a.sid,a.f1,a.f2,b.t,b.v from a,b where a.sid = b.sid) m group by SID , F1 , F2'
exec(@sql) drop table A,B /*
sid f1 f2 v1 v2
----------- ----------- ----------- ----------- -----------
1 2 3 4 2
2 2 1 3 4
3 3 2 5 2 (所影响的行数为 3 行) SID F1 F2 V1 V2
----------- ----------- ----------- ----------- -----------
1 2 3 4 2
2 2 1 3 4
3 3 2 5 2
*/
[SQL]合并字符串的更多相关文章
- 在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串、补足行数)
原文:在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串.补足行数) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所 ...
- MSSQL Server数据库的四种连接方法和sql连接字符串
MSSQL Server数据库的四种连接方法和sql连接字符串 分类: [ 03 ] C#(131) [ 07 ] SQL Server(68) [ 01 ] .NET(189) 今天用SQL Ser ...
- sql 解析字符串添加到临时表中 sql存储过程in 参数输入
sql 解析字符串添加到临时表中 sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表 FROM dbo.Func_SplitOneCol ...
- 《Python CookBook2》 第一章 文本 - 去字符串两端的空格 && 合并字符串 && 将字符串逐字符或者逐词反转
去字符串两端的空格 任务: 获得一个开头和末尾都没有多余空格的字符串. 解决方案: 字符串对象的lstrip.rstrip和strip 方法正是为这种任务而设计的.这几个方法都不需要参数,它们会直接返 ...
- Sql Sever 字符串截取汉字
最近需要在SQL的字符串中截取汉字,利用unicode函数判断字符的unicode编码,根据编码范围过滤掉非汉字字符. 写成了一个function /*@str 需要获取汉字的字符串*/ create ...
- sql server 字符串替换函数REPLACE
sql server 字符串替换函数REPLACE函数的使用 <pre name="code" class="sql">--参数1:需要替换字符的母 ...
- SQL 操作字符串
SQL操作字符串相对来说比较难一点,现在总结几个常用的SQL 对字符串的操作: declare @dd nvarchar(12) set @dd='2015-03-13' print @dd decl ...
- sql server字符串的类型
sql server字符串分为不同的类型,下面就将为您介绍几个sql server字符串的常见类型,希望对您学习sql server字符串能有所帮助. nchar 此数据类型可存储1~4000个定长U ...
- SQL中字符串截取、连接、替换等函数的用法
一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...
随机推荐
- kubernetes centos 安装
1. 安装 yum install -y etcd kubernetes 2. 配置 docker /etc/sysconfig/doc ...
- sql查询重复记录并取对应最小值
原表(aa): id a b 1 22 456 2 22 256 ...
- 使用async属性异步加载执行JavaScript
HTML5让我兴奋的一个最大的原因是,它里面实现的新功能和新特征都是我们长久以来一直期待的.比如,我以前一直在使用placeholders,但以前必须要用JavaScript实现.而HTML5里给Ja ...
- BI案例:BI在连锁零售业应用(ZT)
第一部分:连锁零售企业上BI的必要性. 目前国内的连锁零售行业的发展趋势,呈现出产业规模化,经营业态多样化,管理精细化的特点.所谓管理精细化就是"精耕细作搞管理,领先一步订系统". ...
- C/C++ 函数压栈方式
一,不同关键字,系统压栈方式 1,如果函数func是__cdecl(VC下的默认调用方式),调用时情况如下 int main() { //参数从右到左压栈 push 4 pus ...
- jsoncpp用法通俗易懂之将数据合成json格式
void *upload(void *pParam) { CUpSender *s = (CUpSender*)pParam; map<string, string> mx; char t ...
- HackerRank "AND xor OR"
Actually I think problem statement is somewhat misleading. No need to mention range [L, R] at all. T ...
- 预定义宏__GNUC__和_MSC_VER
一.预定义__GNUC__宏 1 __GNUC__ 是gcc编译器编译代码时预定义的一个宏.需要针对gcc编写代码时, 可以使用该宏进行条件编译. 2 __GNUC__ 的值表示gcc的版本.需要针对 ...
- POI按照源单元格设置目标单元格格式
原文:http://jjw198874.blog.163.com/blog/static/1889845522011102401854234/ POI按照源单元格设置目标单元格格式 poi按照一个源单 ...
- Linux下生成patch和打patch
转自:http://blog.csdn.net/dl0914791011/article/details/17299103 通过diff工具生成补丁, patch工具打上补丁. 在使用diff之前, ...