SQL查询列转行(多表查询,并分组)

liwei47760257 2008-10-27 12:01:20
多行记录和平为一行SQL(多表查询)

问题描述:
表:TAB_INFORMATION_KEYWORD (以下简称t1)
含有3个字段:
AUTOID INFORMATION_ID TAB_KEYWORD_DICTIONARY_ID
1 2 1
2 4 1
3 6 2
表: TAB_KEYWORD_DICTIONARY (以下简称t2)
含有3个字段
AUTOID KEYWORD KEYWORD_EN
1 中国 zg
2 欢迎 hy

所求结果: 这个查询结果关联到这2个表 ,所需要的结果如下
( t2) KEYWORD_EN (t1) INFORMATION_ID
zg 2,4
hy 6

问题就把理应多行记录合并为1行,并分组.(2个表查询)
希望大大们帮下我,我整了1天了. 在线等! 感激不尽
我要语句,别整语法
...全文
1561 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
underlemontree 2008-10-28
  • 打赏
  • 举报
回复

create table [t1] (AUTOID int,INFORMATION_ID int,TAB_KEYWORD_DICTIONARY_ID int)
insert into [t1]
select 1,2,1 union all
select 2,4,1 union all
select 3,6,2
create table [t2] (AUTOID int,KEYWORD varchar(4),KEYWORD_EN varchar(2))
insert into [t2]
select 1,'中国','zg' union all
select 2,'欢迎','hy'

go
select * from t1
select * from t2

declare @tab table(id int,infor varchar(100))
declare @a int,@b int,@s varchar(100),@old int

declare china cursor
for
select information_id,TAB_KEYWORD_DICTIONARY_ID from t1

open china
fetch china into @a,@b
select @old=@b,@s=''
while @@fetch_status =0
begin
if @b=@old
select @s=@s+','+cast(@a as varchar(10))
else
begin
insert into @tab values(@old,stuff(@s,1,1,''))
select @s=','+cast(@a as varchar(10)),@old=@b
end
fetch china into @a,@b
end
insert into @tab values(@b,stuff(@s,1,1,''))
close china
deallocate china
select * from @tab
select keyword_en,infor from t2 g,@tab h where g.autoid=h.id

dawugui 2008-10-27
  • 打赏
  • 举报
回复
--2000中用函数的方法.
create table [t1] (AUTOID int,INFORMATION_ID int,TAB_KEYWORD_DICTIONARY_ID int)
insert into [t1]
select 1,2,1 union all
select 2,4,1 union all
select 3,6,2
create table [t2] (AUTOID int,KEYWORD varchar(4),KEYWORD_EN varchar(2))
insert into [t2]
select 1,'中国','zg' union all
select 2,'欢迎','hy'
go

--创建一个合并的函数
create function f_hb(@TAB_KEYWORD_DICTIONARY_ID int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(INFORMATION_ID as varchar) from t1 where TAB_KEYWORD_DICTIONARY_ID = @TAB_KEYWORD_DICTIONARY_ID
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select t2.KEYWORD_EN , n.INFORMATION_ID from t2,
(select distinct TAB_KEYWORD_DICTIONARY_ID ,dbo.f_hb(TAB_KEYWORD_DICTIONARY_ID ) as INFORMATION_ID from t1) n
where t2.AUTOID = n.TAB_KEYWORD_DICTIONARY_ID

drop table t1,t2
drop function dbo.f_hb

/*
KEYWORD_EN INFORMATION_ID
---------- --------------
zg 2,4
hy 6
*/
dawugui 2008-10-27
  • 打赏
  • 举报
回复
--2005中的方法
create table [t1] (AUTOID int,INFORMATION_ID int,TAB_KEYWORD_DICTIONARY_ID int)
insert into [t1]
select 1,2,1 union all
select 2,4,1 union all
select 3,6,2
create table [t2] (AUTOID int,KEYWORD varchar(4),KEYWORD_EN varchar(2))
insert into [t2]
select 1,'中国','zg' union all
select 2,'欢迎','hy'
go

select t2.KEYWORD_EN , n.INFORMATION_ID from t2,
(select TAB_KEYWORD_DICTIONARY_ID, [INFORMATION_ID]=stuff((select ','+cast(INFORMATION_ID as varchar) from t1 t where TAB_KEYWORD_DICTIONARY_ID=t1.TAB_KEYWORD_DICTIONARY_ID for xml path('')), 1, 1, '') from t1 group by TAB_KEYWORD_DICTIONARY_ID) n
where t2.autoid = n.TAB_KEYWORD_DICTIONARY_ID

drop table t1,t2
/*
KEYWORD_EN INFORMATION_ID
---------- --------------
zg 2,4
hy 6

(2 行受影响)
*/
csdyyr 2008-10-27
  • 打赏
  • 举报
回复

问题描述:
无论是在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 行受影响)
--*/

tmdzys 2008-10-27
  • 打赏
  • 举报
回复
学习中
-狙击手- 2008-10-27
  • 打赏
  • 举报
回复
create table [t1] (AUTOID int,INFORMATION_ID int,TAB_KEYWORD_DICTIONARY_ID int)
insert into [t1]
select 1,2,1 union all
select 2,4,1 union all
select 3,6,2 union all
select 4,7,1
create table [t2] (AUTOID int,KEYWORD varchar(4),KEYWORD_EN varchar(2))
insert into [t2]
select 1,'中国','zg' union all
select 2,'欢迎','hy'
create table [t3] (AUTOID int,INFO_ID int,ORDER_ID int,TOP_ORDER_ID int)
insert into t3 values(1 , 4 , 4 , -1 )
insert into t3 values(2 , 6 , 5 , -1 )
insert into t3 values(3 , 7 , 2 , -1 )
insert into t3 values(4 , 2 , 1 , 5 )
go
SELECT
t2.KEYWORD_EN,
B.INFORMATION_ID
FROM t2
CROSS APPLY(
SELECT INFORMATION_ID = STUFF(
(
SELECT
  • = ',' + RTRIM
  • (t1.INFORMATION_ID)
    FROM t1 ,t3
    WHERE t1.INFORMATION_ID = t3. INFO_ID and t2.AUTOID = t1.TAB_KEYWORD_DICTIONARY_ID
    order by t3.TOP_ORDER_ID desc, ORDER_ID desc
    FOR XML PATH(''), TYPE
    ).value('/', 'varchar(8000)'),
    1, 1, '')
    )B


    drop table t1,t2,t3

    /*
    KEYWORD_EN INFORMATION_ID
    ---------- -----------------
    zg 2,4,7
    hy 6

    (2 行受影响)
    */
csdyyr 2008-10-27
  • 打赏
  • 举报
回复

CREATE TABLE T1(AUTOID INT, INFORMATION_ID INT, TAB_KEYWORD_DICTIONARY_ID INT)
INSERT T1
SELECT 1, 2, 1 UNION ALL
SELECT 2, 4, 1 UNION ALL
SELECT 3, 6, 2 UNION ALL
SELECT 3, 7, 1

CREATE TABLE T2(AUTOID INT, KEYWORD NVARCHAR(10), KEYWORD_EN VARCHAR(10))
INSERT T2
SELECT 1, N'中国', 'zg' UNION ALL
SELECT 2, N'欢迎', 'hy' UNION ALL
SELECT 3, N'测试', 'cs'

CREATE TABLE T3(AUTO_ID INT, INFO_ID INT, ORDER_ID INT, TOP_ORDER_ID INT)
INSERT T3
SELECT 1, 4, 4, -1 UNION ALL
SELECT 2, 6, 5, -1 UNION ALL
SELECT 3, 7, 2, -1 UNION ALL
SELECT 4, 2, 1, 5


SELECT INFORMATION_ID,KEYWORD_EN INTO T4
FROM T1 JOIN T2 ON T2.AUTOID=TAB_KEYWORD_DICTIONARY_ID JOIN T3 ON INFO_ID=INFORMATION_ID
ORDER BY KEYWORD_EN,TOP_ORDER_ID desc, ORDER_ID desc
GO

CREATE FUNCTION GetString(@KEYWORD_EN VARCHAR(10))
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @SQL VARCHAR(100)
SET @SQL=''
SELECT @SQL=@SQL+','+RTRIM(INFORMATION_ID) FROM T4 WHERE KEYWORD_EN=@KEYWORD_EN
RETURN STUFF(@SQL,1,1,'')
END
GO

SELECT KEYWORD_EN,INFORMATION_ID=dbo.GetString(KEYWORD_EN) FROM T4 GROUP BY KEYWORD_EN

DROP TABLE T1
DROP TABLE T2
DROP TABLE T3
DROP TABLE T4
DROP FUNCTION GetString
/*
KEYWORD_EN INFORMATION_ID
---------- ----------------------------------------------------------------------------------------------------
hy 6
zg 2,4,7
*/
liwei47760257 2008-10-27
  • 打赏
  • 举报
回复
我是楼主, 问题已更新
请看:
http://topic.csdn.net/u/20081027/12/d43741b4-b18b-4cfb-8fb0-d89a2136fba4.html 15楼!
ChinaJiaBing 2008-10-27
  • 打赏
  • 举报
回复

if object_id('t1')is not null
drop table t1
if object_id('t2')is not null
drop table t2
if object_id('F')is not null
drop function F
go
create table t1 (AUTOID int,INFORMATION_ID varchar(10),TAB_KEYWORD_DICTIONARY_ID int)
insert into t1 select 1,2,1
union all select 2,4,1
union all select 3,6,2
create table t2 (AUTOID int,KEYWORD varchar(10),KEYWORD_EN varchar(10))
insert into T2 select 1,'中国','zg'
union all select 2,'欢迎','hy'
--select * from @t1
--select * from @t2
------------------------------
---select KEYWORD_EN,INFORMATION_ID from @t2 a join @t1 b on a.autoid=b.TAB_KEYWORD_DICTIONARY_ID
------------------------
--select * from @t1
------
go
create function F (@id VARCHAR(10))
returns varchar(800)
as
begin
declare @str varchar(800)
set @str=''
select @str=isnull(@str,'')+','+INFORMATION_ID from T1 where TAB_KEYWORD_DICTIONARY_ID=@ID
return stuff(@str,1,1,'')
end
go
select distinct KEYWORD_EN,INFORMATION_ID=DBO.F(TAB_KEYWORD_DICTIONARY_ID) from t2 a join t1 b on a.autoid=b.TAB_KEYWORD_DICTIONARY_ID
hy 6
zg 2,4
pt1314917 2008-10-27
  • 打赏
  • 举报
回复

--合并函数:
create function g_fs(@TAB_KEYWORD_DICTIONARY_ID int)
returns varchar(100)
as
begin
declare @sql varchar(100)
select @sql=isnull(@sql+',','')+ltrim(INFORMATION_ID) from [TAB_INFORMATION_KEYWORD] where TAB_KEYWORD_DICTIONARY_ID=@TAB_KEYWORD_DICTIONARY_ID
return @sql
end
go

--调用
select KEYWORD_EN,INFORMATION_ID=dbo.g_fs(AUTOID) from [TAB_KEYWORD_DICTIONARY]


27,580

社区成员

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

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