[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 ...
随机推荐
- Jquery 使用小结
JQuery API中文档地址:http://www.hemin.cn/jq/index.html JQuery 中文社区:http://www.jquery.org.cn/ 1.siblings() ...
- [转]LOG4J汇编教程edit Z10
摘自:http://wucuixia.blog.sohu.com/12057602.html LOG背景 我们在编程时经常不可避免地要使用到一些日志操作,比如开发阶段的调试信息.运行时的日志记录及审计 ...
- UI-程序的运行顺序
在AppDelegate.m里面的每个方法里都输入(包括main文件里也输入) NSLog(@"%s %d”,__func__,__LINE__); __func__ :代表使用的方法 __ ...
- 【mysql】SQL常用指令
常用操作指令 show databases;显示所有的数据库: use dbName; 使用指定数据库 show tables; 显示所有的数据表: desc tableName; 查看数据表的字段信 ...
- Understanding and Managing SMTP Virtual Servers
Simple Mail Transfer Protocol (SMTP) Service Overview The Simple Mail Transfer Protocol (SMTP) servi ...
- perl中的grep函数介绍
grep函数 (如果你是个的新手,你可以先跳过下面的两段,直接到 Grep vs.loops 样例这一部分,放心,在后面你还会遇到它) <pre>grep BLOCK LISTgrep E ...
- activiti自定义流程之整合(四):整合自定义表单部署流程定义
综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功. 正因为如此,在创建了流程模型之 ...
- POJ题目分类
POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一 ...
- Flash AS 响应双击事件MouseEvent.DOUBLE_CLICK
没想到在WinForm简简单单的一个问题,在AS里会成为一个坑. 我遇到的这个问题是由于Loader没有设置doubleClickEnabled=true而导致的. 因此出现这个问题,请思考是否由于此 ...
- VMWare虚拟机下RedHat 9.0linux的网络设置
VMWare虚拟机下安装的RedHat 9.0 linux有三种方式实现上网,桥接.nat.host-only.本来想用桥接方式的,可总是因为配置网络出现问题而不能上网,还把 sygate4.5(代理 ...