+ -
当前位置:首页 → 问答吧 → 求一条SQL语句,在线等~~

求一条SQL语句,在线等~~

时间:2011-11-29

来源:互联网

有数据表:
ID UserID Add Quantity Price Remark
001 A mm 1 2 xxxx 
002 A mm 1 2 xxxx  
003 A mm 1 3 xxxx  
004 B dd 2 2 xxxyy
005 C ww 1 2 ererr
006 B dd 1 3 34335

要得出以下结果:对于同一个UserID和Add的,就把ID用逗号连起来,并把他们的总金额Quantity * Price

ID UserID Add total Remark
001,002,003 A mm 7 xxxx 
004,006 B dd 7 xxxyy
005 C ww 2 ererr


   

 

作者: lsp69   发布时间: 2011-11-29

SQL code
select UserID,Add,total=sum(Price),max(remark),
       ID=stuff((select ','+id from tb where UserID=a.UserID and Add=a.Add for xml path('')),1,1,'')
from tb a group by UserID,Add

作者: ssp2009   发布时间: 2011-11-29

SQL code
合并列值 
--*******************************************************************************************
表结构,数据如下: 
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) 

*/ 

作者: ssp2009   发布时间: 2011-11-29

SQL code
合并列值 
--*******************************************************************************************
表结构,数据如下: 
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 

作者: fredrickhu   发布时间: 2011-11-29

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

这个方法,你只连接一列是可以解决,而且只能显示两列,但是我表要显示N列,但列的内容不同,我不是要所有列都group by

作者: lsp69   发布时间: 2011-11-29

SQL code

select UserID,Add,total=sum(ISNULL(Price,0)),max(remark),
       ID=stuff((select ','+id from tb where UserID=a.UserID and Add=a.Add for xml path('')),1,1,'')
from tb a group by UserID,Add

作者: t3121522520   发布时间: 2011-11-29

SQL code

if object_id('tb','u') is not null
   drop table tb
go
create table tb
(
 id varchar(3),
 userid varchar(10),
 [add] varchar(10),
 quantity int,
 price int,
 remark varchar(10)
)
go
insert into tb
select '001','A','mm',1,2,'xxxx' union all
select '002','A','mm',1,2,'xxxx' union all
select '003','A','mm',1,3,'xxxx' union all
select '004','B','dd',2,2,'xxxyy' union all
select '005','C','ww',1,2,'xxxyy' union all
select '006','B','dd',1,3,'34335'
go
select id=stuff((select ','+ID from tb where UserID=a.userID for xml path('')),1,1,''),UserID,[Add],total=sum(quantity*price),remark=max(remark) from tb a group by UserID,[Add]
go
/*
id                                                                                                                                                                                                                                                               UserID     Add        total       remark
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- ---------- ----------- ----------
004,006                                                                                                                                                                                                                                                          B          dd         7           xxxyy
001,002,003                                                                                                                                                                                                                                                      A          mm         7           xxxx
005                                                                                                                                                                                                                                                              C          ww         2           xxxyy

(3 行受影响)
*/

作者: pengxuan   发布时间: 2011-11-29

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 
要变成这样怎么写?表名字段名字段值都是变量
CREATE FUNCTION dbo.f_strUnite(@Table varchar(300),@Field varchar(300),@idField int,@id int) 
RETURNS varchar(8000) 
AS 
BEGIN 
  DECLARE @s varchar(8000) 
  DECLARE @str varchar(8000) 
  SET @str = '' 
  set @s='SELECT ' + @str = @str + ',' + @Field + ' FROM ' + @Table + ' WHERE ' + @idField + '= ' + @id 
  RETURN STUFF(@str, 1, 1, '') 
END

作者: lsp69   发布时间: 2011-11-29

热门下载

更多