各位高手,sql语句写不出,请帮帮忙啊

parss 2009-12-04 10:19:23

有一个表 tb
有这么几个字段
clno sizeno factory fqt
YN1759 L B01004 100.00
YN1759 L B02002 300.00
YN1759 L B02004 500.00
YN1759 L B02006 10.00
WN2560 M B01003 10.00
WN2560 M B01006 100.00


想要的结果是:
clno sizeno note
YN1759 L B01004(100.00),B02002(300.00),B02004(500.00),B02006(10.00)
WN2560 M B01003(10.00),B01006(100.00)

前面两个字段相同的,后面相加


...全文
142 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiqi860819 2009-12-04
  • 打赏
  • 举报
回复

CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + note=(factory+fqt)
FROM tb WHERE clno=@id
RETURN STUFF(@r, 1, 1, '')
END
GO
select clno,sizeno,note=dbo.f_str(clno)from tb group by clno,sizeno
aimee_99 2009-12-04
  • 打赏
  • 举报
回复
SQL code问题描述:
无论是在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 行受影响)
--*/

--各种字符串分函数

--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
--*/
GO
if not object_id('A') is null
drop table A
Go
Create table A([id] int,[cname] nvarchar(2))
Insert A
select 1,N'张三' union all
select 2,N'李四' union all
select 3,N'王五' union all
select 4,N'蔡六'
Go
--> -->

if not object_id('B') is null
drop table B
Go
Create table B([id] int,[cname] nvarchar(5))
Insert B
select 1,N'1,2,3' union all
select 2,N'3,4'
Go
create function F_str(@cname nvarchar(100))
returns nvarchar(100)
as
begin
select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')>0
return @cname
end
go
select [id],dbo.F_str([cname])[cname] from B

id cname
----------- ----------------------------------------------------------------------------------------------------
1 张三,李四,王五
2 王五,蔡六

(2 個資料列受到影響)
guguda2008 2009-12-04
  • 打赏
  • 举报
回复
我是来蹭分的,LZ可怜可怜我给我1分吧
parss 2009-12-04
  • 打赏
  • 举报
回复
我写的语句不行,结果不是我想要的。


declare @pn nvarchar(10);
declare @sql nvarchar(2000)
set @pn='P27500'
set @sql='select clno,sizeno'
select @sql=@sql+',case sizeno when '''+sizeno+''' then factory end '
from (select distinct sizeno,factory from orderarrange where pn=@pn) as a
select @sql=@sql+' from orderarrange where pn='''+@pn+''' and isnull(pid,'''')!='''' group by clno,sizeno,factory'
exec (@sql)
--print @sql


/*
clno sizeno
------ ------ --------- -------------- ----------- ---------- ----------- -------- --------- ---------------------------------
GN4338 M NULL NULL NULL NULL NULL B01001 B01001 B01001 B01001 NULL NULL
WN2560 M NULL NULL NULL NULL NULL B01003 B01003 B01003 B01003 NULL NULL
WN2560 M NULL NULL NULL NULL NULL B01006 B01006 B01006 B01006 NULL NULL
YN1759 L B01004 B01004 B01004 B01004 B01004 NULL NULL NULL NULL NULL NULL
YN1759 L B02002 B02002 B02002 B02002 B02002 NULL NULL NULL NULL NULL NULL
YN1759 L B02004 B02004 B02004 B02004 B02004 NULL NULL NULL NULL NULL NULL
YN1759 L B02006 B02006 B02006 B02006 B02006 NULL NULL NULL NULL NULL NULL

*/

华夏小卒 2009-12-04
  • 打赏
  • 举报
回复
---------------------------------------------
--> Author : js_szy
--> Target : 各位大大,小卒就是想要一朵花
--> Date : 2009-12-04 10:21:02
--> Version: SQL Server 2005
---------------------------------------------

--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb] (clno varchar(6),sizeno varchar(1),factory varchar(6),fqt numeric(5,2))
insert into [tb]
select 'YN1759','L','B01004',100.00 union all
select 'YN1759','L','B02002',300.00 union all
select 'YN1759','L','B02004',500.00 union all
select 'YN1759','L','B02006',10.00 union all
select 'WN2560','M','B01003',10.00 union all
select 'WN2560','M','B01006',100.00

if object_id('f_str') is not null drop function f_str
go
create function f_str(@no varchar(20))
returns varchar(200)
as
begin
declare @s varchar(1000)
select @s=isnull(@s+',','')+factory+'('+ltrim(fqt)+')'
from tb
where clno=@no

return @s
end
go

select clno,sizeno,note=dbo.f_str(clno)
from [tb]
group by clno,sizeno


clno sizeno note
------ ------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
WN2560 M B01003(10.00),B01006(100.00)
YN1759 L B01004(100.00),B02002(300.00),B02004(500.00),B02006(10.00)

(2 行受影响)
--小F-- 2009-12-04
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2009-12-04 10:24:27
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([clno] varchar(6),[sizeno] varchar(1),[factory] varchar(6),[fqt] numeric(5,2))
insert [tb]
select 'YN1759','L','B01004',100.00 union all
select 'YN1759','L','B02002',300.00 union all
select 'YN1759','L','B02004',500.00 union all
select 'YN1759','L','B02006',10.00 union all
select 'WN2560','M','B01003',10.00 union all
select 'WN2560','M','B01006',100.00
--------------开始查询--------------------------
select
clno,sizeno,
note=stuff((select ','+factory+'('+ltrim(fqt)+')' from tb where clno=t.clno and sizeno=t.sizeno for xml path('')),1,1,'')
from
tb t
group by
clno,sizeno

----------------结果----------------------------
/* clno sizeno note
------ ------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
WN2560 M B01003(10.00),B01006(100.00)
YN1759 L B01004(100.00),B02002(300.00),B02004(500.00),B02006(10.00)

(2 行受影响)
*/
水族杰纶 2009-12-04
  • 打赏
  • 举报
回复
--> Title  : Generating test data [tb]
--> Author : wufeng4552
--> Date : 2009-12-04 10:20:37
if object_id('[tb]') is not null drop table [tb]
go
create table [tb] (clno nvarchar(12),sizeno nvarchar(2),factory nvarchar(12),fqt numeric(5,2))
insert into [tb]
select 'YN1759','L','B01004',100.00 union all
select 'YN1759','L','B02002',300.00 union all
select 'YN1759','L','B02004',500.00 union all
select 'YN1759','L','B02006',10.00 union all
select 'WN2560','M','B01003',10.00 union all
select 'WN2560','M','B01006',100.00
IF OBJECT_ID('dbo.f_str')IS NOT NULL DROP FUNCTION dbo.f_str
GO
CREATE FUNCTION dbo.f_str(@id nvarchar(12))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + factory+'('+LTRIM(fqt)+')'
FROM tb
WHERE clno=@id
RETURN STUFF(@r, 1, 1, '')
END
GO
SELECt clno,
sizeno,
NOTE=dbo.f_str(clno)
FROM tb
GROUP BY clno,sizeno
/*
clno sizeno NOTE
------------ ------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
WN2560 M B01003(10.00),B01006(100.00)
YN1759 L B01004(100.00),B02002(300.00),B02004(500.00),B02006(10.00)

(2 個資料列受到影響)

*/
--小F-- 2009-12-04
  • 打赏
  • 举报
回复
合并列值 
--*******************************************************************************************
表结构,数据如下:
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. 旧的解决方法(在sql server 2000中只能用函数解决。)
--=============================================================================
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
--1. 创建处理函数
CREATE FUNCTION dbo.f_strUnite(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ',' + value FROM tb WHERE id=@id
RETURN STUFF(@str, 1, 1, '')
END
GO
-- 调用函数
SELECt id, value = dbo.f_strUnite(id) FROM tb GROUP BY id
drop table tb
drop function dbo.f_strUnite
go
/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/
--===================================================================================
2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
-- 查询处理
SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
SELECT [values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM tb N
WHERE id = A.id
FOR XML AUTO
), ' <N value="', ','), '"/>', ''), 1, 1, '')
)N
drop table tb

/*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc

(2 行受影响)
*/

--SQL2005中的方法2
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '')
from tb
group by id

/*
id values
----------- --------------------
1 aa,bb
2 aaa,bbb,ccc

(2 row(s) affected)

*/

drop table tb
aimee_99 2009-12-04
  • 打赏
  • 举报
回复
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb([clno] varchar(6),[sizeno] varchar(1),[factory] varchar(6),[fqt] numeric(5,2))
insert #tb
select 'YN1759','L','B01004',100.00 union all
select 'YN1759','L','B02002',300.00 union all
select 'YN1759','L','B02004',500.00 union all
select 'YN1759','L','B02006',10.00 union all
select 'WN2560','M','B01003',10.00 union all
select 'WN2560','M','B01006',100.00

--->查询
select clno,sizeno,
note=stuff((select ','+factory+'('+ltrim(fqt)+')' from #tb where clno=t.clno and sizeno=t.sizeno for xml path('')),1,1,'')
from #tb t
group by clno,sizeno

/**
clno sizeno note
------ ------ ---------------------------------------------------------------------
WN2560 M B01003(10.00),B01006(100.00)
YN1759 L B01004(100.00),B02002(300.00),B02004(500.00),B02006(10.00)

(所影响的行数为 2 行)
**/
rucypli 2009-12-04
  • 打赏
  • 举报
回复
create function fun_test(@clno varchar(30))
return varchar(300)
as
begin
declare @temp varchar(300)
set @temp = ''
select @temp = @temp + factory + '('+fqt + ')' + ','
from tb
where clno = @clno
end

select clno,sizeno,fun_test(clno)
from tb
group by clno,sizeno
aimee_99 2009-12-04
  • 打赏
  • 举报
回复
select clno,sizeno,
note=stuff((select ','+factory+ltrim(fqt) from tb where clno=t.clno and sizeno=t.sizeno for xml path('')),1,1,'')
from tb t
group by clno,sizeno
水族杰纶 2009-12-04
  • 打赏
  • 举报
回复
論壇N多
gaomiqzhi 2009-12-04
  • 打赏
  • 举报
回复
学习
J1985Z 2009-12-04
  • 打赏
  • 举报
回复
mark

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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