SQL语句怎么实现几列数据合并成一条??

表1:sCode编号字段表2:sCode表1的sCode,关联用sQuality品质fNum数量表1:sCode001002003表2:sCode,sQuality,fN... 表1:
sCode 编号字段

表2:
sCode 表1的sCode,关联用
sQuality 品质
fNum 数量

表1:
sCode
001
002
003

表2:
sCode,sQuality,fNum
001 a 10
001 b 15
001 c 20
002 a 10
002 b 90
002 c 80

最后结果为:
001,a,10,b,15,c,20
002,a,10,b,90,c,80

执行结果就要把三条001和三条002的数据各合并成一条,请高手指教!!!
表结构应该没问题,只要能实现出最后的结果就可以,用的数据库是sqlserver,请高手指导,谢谢!!!
展开
 我来答
uaoou
2008-08-30 · TA获得超过124个赞
知道小有建树答主
回答量:168
采纳率:0%
帮助的人:139万
展开全部
select DISTINCT ta.sCode, ta.sQuality, ta.fNum, tb.sQuality, tb.fNum, tc.sQuality, tc.fNum
from
(

select sCode, sQuality, max(fNum) as fNum from 表2
where sQuality = 'a'
group by sCode, sQuality

) as ta left join (

select sCode, sQuality, max(fNum) as fNum from 表2
where sQuality = 'b'
group by sCode, sQuality

) as tb on tb.sCode = ta.sCode left join (

select sCode, sQuality, max(fNum) as fNum from 表2
where sQuality = 'c'
group by sCode, sQuality

) as tc on tc.sCode = ta.sCode
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fjh658
2008-08-28 · 超过34用户采纳过TA的回答
知道答主
回答量:94
采纳率:0%
帮助的人:67.1万
展开全部
是什么数据库oracle ?,sqlserver?
oralce :
CREATE OR REPLACE FUNCTION get_Val(tmp_c1 NUMBER) RETURN VARCHAR2 IS
col_temp VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT squality, fnum FROM t_02 WHERE scode = tmp_c1) LOOP
col_temp := col_temp || ' ' || cur.squality || ' ' || cur.fnum;
END LOOP;
col_temp := rtrim(col_temp, 1);
RETURN col_temp;
END;
/

select distinct a.sCode, get_Val(b.scode) "RESULT"
from t_01 a
join t_02 b on a.scode = b.scode;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mynew100
2008-08-28 · 超过47用户采纳过TA的回答
知道小有建树答主
回答量:155
采纳率:0%
帮助的人:0
展开全部
建议楼主修改表的结构,现在这个结构似乎实现不了。表一放sCode和sQuality,表2放sCode和fNum
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
上達
2008-08-28 · TA获得超过165个赞
知道答主
回答量:294
采纳率:0%
帮助的人:0
展开全部
期待高手`~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
追问_求解
2008-08-31
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
要用sqlserver数据库的语句,fjh658 谢谢你的回答,但是运行后显示的错误
“ 服务器: 消息 195,级别 15,状态 10,行 1
'get_Val' 不是可以识别的 函数名。 ”

一、以下是一种形式,但是并不是我最想要的结果,大家可以借鉴下,有好的提议可以尽量提出来.

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[表1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[表1]
GO

CREATE TABLE [dbo].[表1] (
[sCode] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[表2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[表2]
GO

CREATE TABLE [dbo].[表2] (
[sCode] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[sQuality] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[fNum] [int] NULL
) ON [PRIMARY]
GO

CREATE FUNCTION dbo.f_str1(@sCode varchar(10))
RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re=''
SELECT @re=@re+','+CAST(squality as varchar)+','+CAST(fNum as varchar)
FROM 表2
WHERE sCode=@sCode
RETURN(STUFF(@re,1,1,''))
END
GO

SELECT sCode,sQuality=dbo.f_str1(sCode) FROM 表2 GROUP BY sCode
把里面的数据都在查询分析器里运行一次就可以得到我想要的结果了,只是这样的结果只有两个字段,我想要的是每个数据都一个列字段,虽然这个效果不好,但是有兴趣的人,可以试试看

二、我认为较为精确的算法
declare @sqlstr varchar (2000),@sQuality varchar (50),@iLoop int
select @sqlstr=''
select @iLoop=1
Declare ItemList
Cursor for select sQuality from table2 group by sQuality
Open ItemList
Fetch next from ItemList into @sQuality
while @@Fetch_STATUS=0
BEGIN
select @sqlstr=isnull(@sqlstr,'')+ ',(select top 1 sQuality from table2 where a.scode=scode and sQuality='''+isnull(@sQuality,'')+''' group by sQuality) Item'+cast(@iLoop as varchar) +
',(select fnum from table2 where a.scode=scode and sQuality='''+isnull(@sQuality,'')+''' group by fnum) ItemNum'+cast(@iLoop as varchar)
select @iLoop=@iLoop+1
Fetch next from ItemList into @sQuality
END
close ItemList
DEALLOCATE ItemList
select @sqlstr= 'select scode' +isnull(@sqlstr,'') + ' from table2 a where scode in (select scode from table1) group by scode'
Exec (@sqlstr)

署名: 都是问题惹的祸
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式