****SQL实例问题******求助*****谢谢!

hcl8260 2013-12-19 10:50:14
现在有一张数据表:Table1
FcaID FSec FName
001 1 卡片1
001 2 卡片2
002 1 卡片3
002 2 卡片4
002 3 卡片5

说明:同一个FcaID可能对应着N条记录(1=<N<=10)

如果不通过写存储过程或函数,只用sql,能否实现以下取数:
FcaID FName
001 卡片1卡片2
002 卡片3卡片4卡片5

SqlServer2000,多谢~~~~~~
...全文
385 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
t101lian 2013-12-23
  • 打赏
  • 举报
回复
if object_id('tempdb..#a') is not null drop table #a 
go 
create table #a(FcaID varchar(10), FSec int, FName varchar(20)) 
insert into #a
select '001',     1    ,'卡片1' union all
select '001',     2    ,'卡片2' union all
select '002',     1    ,'卡片3' union all
select '002',     2    ,'卡片4' union all
select '002',     3    ,'卡片5'
go
----开始查询
select FcaID,( select Fname+('')  from #a where FcaID=a.FcaID for xml path(''))
 as FName from #a a group by FcaID
----结果
/*  FcaID   FName
-----------------
001	卡片1卡片2
002	卡片3卡片4卡片5
*/
t101lian 2013-12-22
  • 打赏
  • 举报
回复
SELECT b.FcaID,
status=stuff((
select','+cast(FName as varchar(500))FROM Table1 a WHERE a.FcaID = b.FcaID for xml path('')),1,1,'') FROM Table1 b
Group by b.FcaID
唐诗三百首 2013-12-22
  • 打赏
  • 举报
回复

create table Table1
(FcaID varchar(10),FSec int,FName varchar(10))

insert into Table1
 select '001',1,'卡片1' union all
 select '001',2,'卡片2' union all
 select '002',1,'卡片3' union all
 select '002',2,'卡片4' union all
 select '002',3,'卡片5'


create table #result(FcaID varchar(10),FName varchar(100))

insert into #result(FcaID,FName)
 select FcaID,'' from Table1 group by FcaID

while(@@rowcount>0)
begin
 update a
  set a.FName=a.FName+b.FName
  from #result a
  inner join Table1 b on a.FcaID=b.FcaID
  where charindex(b.FName,a.FName,1)=0
end


-- 结果
select * from #result

/*
FcaID      FName
---------- ---------------------
001        卡片1卡片2
002        卡片3卡片4卡片5

(2 row(s) affected)
*/
sqlkxr 2013-12-20
  • 打赏
  • 举报
回复


if object_id('table1') is not null drop table table1
go
create table table1(fcaid varchar(10),fsec int,fname nvarchar(10))

insert into table1
select '001',1,'卡片1'
union all
select '001',2,'卡片2'
union all
select '002',1,'卡片3'
union all
select '002',2,'卡片4'
union all
select '002',3,'卡片5'


create function g(@fcaid varchar(30)) returns nvarchar(500)
as
begin

declare @content nvarchar(500)

select @content=isnull(@content,'')+fname from table1 where fcaid=@fcaid

return @content

end

--查询结果
select fcaid,[fname]=dbo.g(a.fcaid) from table1 a group by fcaid
發糞塗牆 2013-12-19
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-12-19 11:34:51
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--	Dec 28 2012 20:23:12 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[Table1]
if object_id('[Table1]') is not null drop table [Table1]
go 
create table [Table1]([FcaID] varchar(3),[FSec] int,[FName] varchar(5))
insert [Table1]
select '001',1,'卡片1' union all
select '001',2,'卡片2' union all
select '002',1,'卡片3' union all
select '002',2,'卡片4' union all
select '002',3,'卡片5'
--------------开始查询--------------------------


if object_id('F_Str') is not null
    drop function F_Str
go
create function F_Str(@Col1 varchar(5))
returns nvarchar(100)
as
begin
    declare @S nvarchar(100)
    select @S=isnull(@S+',','')+[FName] from [Table1] where [FcaID]=@Col1
    return @S
end
go
Select distinct [FcaID],[FName]=dbo.F_Str([FcaID]) from [Table1]
 
go

----------------结果----------------------------
/* 
FcaID FName
----- ----------------------------------------------------------------------------------------------------
001   卡片1,卡片2
002   卡片3,卡片4,卡片5

*/
Yole 2013-12-19
  • 打赏
  • 举报
回复


有表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 行受影响)
--*/

--各种字符串分函数

--3.3.1 使用游标法进行字符串合并处理的示例。
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
--定义结果集表变量
DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))

--定义游标并进行合并处理
DECLARE tb CURSOR LOCAL
FOR
SELECT col1,col2 FROM tb ORDER BY  col1,col2
DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
OPEN tb
FETCH tb INTO @col1,@col2
SELECT @col1_old=@col1,@s=''
WHILE @@FETCH_STATUS=0
BEGIN
    IF @col1=@col1_old
        SELECT @s=@s+','+CAST(@col2 as varchar)
    ELSE
    BEGIN
        INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
        SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
    END
    FETCH tb INTO @col1,@col2
END
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb
/*--结果
col1       col2
---------- -----------
a          1,2
b          1,2,3
--*/
GO


/*==============================================*/


--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
GO

--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
    DECLARE @re varchar(100)
    SET @re=''
    SELECT @re=@re+','+CAST(col2 as varchar)
    FROM tb
    WHERE col1=@col1
    RETURN(STUFF(@re,1,1,''))
END
GO

--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1       col2
---------- -----------
a          1,2
b          1,2,3
--*/
GO

/*==============================================*/


--3.3.3 使用临时表实现字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
SELECT col1,col2=CAST(col2 as varchar(100)) 
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar(10),@col2 varchar(100)
UPDATE #t SET 
    @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
    @col1=col1,
    col2=@col2
SELECT * FROM #t
/*--更新处理后的临时表
col1       col2
---------- -------------
a          1
a          1,2
b          1
b          1,2
b          1,2,3
--*/
--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
/*--结果
col1       col2
---------- -----------
a          1,2
b          1,2,3
--*/
--删除测试
DROP TABLE tb,#t
GO


/*==============================================*/

--3.3.4.1 每组 <=2 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
    col2=CAST(MIN(col2) as varchar)
        +CASE 
            WHEN COUNT(*)=1 THEN ''
            ELSE ','+CAST(MAX(col2) as varchar)
        END
FROM tb
GROUP BY col1
DROP TABLE tb
/*--结果
col1       col2      
---------- ----------
a          1,2
b          1,2
c          3
--*/

--3.3.4.2 每组 <=3 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
    col2=CAST(MIN(col2) as varchar)
        +CASE 
            WHEN COUNT(*)=3 THEN ','
                +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
            ELSE ''
        END
        +CASE 
            WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
            ELSE ''
        END
FROM tb a
GROUP BY col1
DROP TABLE tb
/*--结果
col1       col2
---------- ------------
a          1,2
b          1,2,3
c          3
--*/

参考:http://bbs.csdn.net/topics/370131952 这有个例子可以参考一下!以前的帖子!
LongRui888 2013-12-19
  • 打赏
  • 举报
回复

create table table1(FcaID varchar(10), FSec int, FName varchar(20))

insert into table1
select '001',     1    ,'卡片1' union all
select '001',     2    ,'卡片2' union all
select '002',     1    ,'卡片3' union all
select '002',     2    ,'卡片4' union all
select '002',     3    ,'卡片5'
go


select FcaID,left(FName,LEN(fname)-1) as fname
from 
(
select FcaID,
       MAX(case when FSec=1 then FName+',' else '' end) +
       MAX(case when FSec=2 then FName+',' else '' end) +
       MAX(case when FSec=3 then FName+',' else '' end) +
       MAX(case when FSec=4 then FName+',' else '' end) +
       MAX(case when FSec=5 then FName+',' else '' end) +
       MAX(case when FSec=6 then FName+',' else '' end) +
       MAX(case when FSec=7 then FName+',' else '' end) +
       MAX(case when FSec=8 then FName+',' else '' end) +
       MAX(case when FSec=9 then FName+',' else '' end) +
       MAX(case when FSec=10 then FName+',' else '' end) as fname
                   
from table1
group by FcaID
)t
/*
FcaID	fname
001	卡片1,卡片2
002	卡片3,卡片4,卡片5
*/
-Tracy-McGrady- 2013-12-19
  • 打赏
  • 举报
回复
2000的静态行列转换应该可以实现
快溜 2013-12-19
  • 打赏
  • 举报
回复
select FcaID, max(case when FSec=1 then FName else '' end)+ max(case when FSec=2 then FName else '' end)+ max(case when FSec=3 then FName else '' end)+ ............... max(case when FSec=9 then FName else '' end)+ max(case when FSec=10 then FName else '' end) from Table1 group by FcaID
KeepSayingNo 2013-12-19
  • 打赏
  • 举报
回复

SELECT b.FcaID,
status=stuff((
select','+convert(varchar(20),[FName])FROM Table1 a WHERE a.FcaID = b.FcaID for xml path('')),1,1,'') FROM Table1 b
Group by b.FcaID

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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