DECLAER @STR VARCHAR(5000) SELECT @STR=ISNULL(@STR+',','')+姓名 FROM TBSELECT 姓名,SUM(分数)AS 分数 FROM TB GROUP BY 姓名 ORDER BY CHARINDEX(','+姓名+',',','+@STR+',')
DECLARE @STR VARCHAR(5000) SELECT @STR=ISNULL(@STR+',','')+姓名 FROM TBSELECT 姓名,SUM(分数)AS 分数 FROM TB GROUP BY 姓名 ORDER BY CHARINDEX(','+姓名+',',','+@STR+',')
---------------------------------------------------------------- -- Author :fredrickhu(小F,向高手学习) -- Date :2009-12-06 21:04:17 -- 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.1 (Build 2600: Service Pack 3) -- ---------------------------------------------------------------- --> 测试数据:[tb] if object_id('[tb]') is not null drop table [tb] go create table [tb]([姓名] varchar(6),[分数] int) insert [tb] select '李连杰',80 union all select '李连杰',90 union all select '周迅',70 union all select '周迅',60 --------------开始查询-------------------------- select 姓名,sum(分数) as 分数 from tb group by 姓名 ----------------结果---------------------------- /* 姓名 分数 ------ ----------- 李连杰 170 周迅 130(2 行受影响)*/
/* -- Author:SQL77--RICHIE -- Version:V1.001 Date:2008-05-15--转Flystone*/-- Test Data: TB If object_id('TB') is not null Drop table TB Go Create table TB(姓名 NVARCHAR(10),分数 int) Go Insert into TB SELECT '李连杰',80 union all SELECT '李连杰',90 union all SELECT '周迅', 70 union all SELECT '周迅', 60 Go --Start DECLARE @STR VARCHAR(5000) SELECT @STR=ISNULL(@STR+',','')+姓名 FROM TBSELECT 姓名,SUM(分数)AS 分数 FROM TB GROUP BY 姓名 ORDER BY CHARINDEX(','+姓名+',',','+@STR+',') --Result: /*(所影响的行数为 4 行)姓名 分数 ---------- ----------- 李连杰 170 周迅 130(所影响的行数为 2 行)*/ --End
select 姓名,分数=(select sum(分数) from tb where 姓名=t.姓名) from tb t
select 姓名,sum(分数) from( select 姓名,分数,row_number() over(order by 姓名) as c from tb ) t group by 姓名 order by min(c)1> select * from tb; 2> go 姓名 分数 ------ ----------- 李连杰 80 李连杰 90 周迅 70 周迅 60(4 rows affected) 1> select 姓名,sum(分数) 2> from( 3> select 姓名,分数,row_number() over(order by 姓名) as c 4> from tb 5> ) t 6> group by 姓名 7> order by min(c); 8> go 姓名 ------ ----------- 李连杰 170 周迅 130(2 rows affected) 1>
我是SQL2000的呀那就直接, 反正“李”也在“周”前面 1> select 姓名,sum(分数) from tb group by 姓名; 2> go 姓名 ------ ----------- 李连杰 170 周迅 130(2 rows affected) 1> 建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://forum.csdn.net/BList/OtherDatabase
---------------------------------------------------------------- -- Author :fredrickhu(小F,向高手学习) -- Date :2009-12-06 21:04:17 -- 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.1 (Build 2600: Service Pack 3) -- ---------------------------------------------------------------- --> 测试数据:[tb] if object_id('[tb]') is not null drop table [tb] go create table [tb]([姓名] varchar(6),[分数] int) insert [tb] select '李连杰',80 union all select '李连杰',90 union all select '周迅',70 union all select '周迅',60 --------------开始查询-------------------------- select distinct 姓名,分数=(select sum(分数) from tb where 姓名=t.姓名) from tb t ----------------结果---------------------------- /* 姓名 分数 ------ ----------- 李连杰 170 周迅 130(2 行受影响)*/
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb] go CREATE TABLE [tb] (姓名 VARCHAR(6),分数 INT) INSERT INTO [tb]SELECT '周迅',70 UNION ALL SELECT '周迅',60 UNION ALL SELECT '李连杰',80 UNION ALL SELECT '李连杰',90 select * from [tb]select id=identity(int,1,1) ,* into #t from tbselect 姓名,分数=sum(分数) from ( select *,rnk=case when id=(select min(id) from #t where 姓名=t.姓名) then id else (select min(id) from #t where 姓名=t.姓名) end from #t t
)K group by 姓名,rnk姓名 分数 周迅 130 李连杰 170
declare @tb table (na varchar(100) , sc int) insert into @tb select '周迅',70 union all select '周迅',60 union all select '李连杰',80 union all select '李连杰',90 把数据改成这样的话,上面的方法好像都不行哟
--> 测试数据: [tb] if object_id('[tb]') is not null drop table [tb] create table [tb] (物料 varchar(4),价格 int) insert into [tb] select '水笔',70 union all select '水笔',80 union all select '水笔',60 union all select '钢笔',90 union all select '钢笔',70 union all select '钢笔',80 go create proc sp_wsp as select id=identity(int,1,1),* into # from [tb] declare @sql varchar(8000) set @sql='select 物料' select @sql=@sql+',[价格'+ltrim(px)+']=max(case px when '+ltrim(px)+'then 价格 else null end)' from (select distinct px=(select count(*) from # where 物料=a.物料 and id<=a.id) from # a)a set @sql=@sql+' from (select px=(select count(*) from # where 物料=a.物料 and id<=a.id),* from # a)a group by 物料 order by min(id)' exec(@sql) go
SELECT @STR=ISNULL(@STR+',','')+姓名 FROM TBSELECT 姓名,SUM(分数)AS 分数
FROM TB
GROUP BY 姓名 ORDER BY CHARINDEX(','+姓名+',',','+@STR+',')
SELECT @STR=ISNULL(@STR+',','')+姓名 FROM TBSELECT 姓名,SUM(分数)AS 分数
FROM TB
GROUP BY 姓名 ORDER BY CHARINDEX(','+姓名+',',','+@STR+',')
-- Author :fredrickhu(小F,向高手学习)
-- Date :2009-12-06 21:04:17
-- 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.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([姓名] varchar(6),[分数] int)
insert [tb]
select '李连杰',80 union all
select '李连杰',90 union all
select '周迅',70 union all
select '周迅',60
--------------开始查询--------------------------
select 姓名,sum(分数) as 分数 from tb group by 姓名
----------------结果----------------------------
/* 姓名 分数
------ -----------
李连杰 170
周迅 130(2 行受影响)*/
-- Author:SQL77--RICHIE
-- Version:V1.001 Date:2008-05-15--转Flystone*/-- Test Data: TB
If object_id('TB') is not null
Drop table TB
Go
Create table TB(姓名 NVARCHAR(10),分数 int)
Go
Insert into TB
SELECT '李连杰',80 union all
SELECT '李连杰',90 union all
SELECT '周迅', 70 union all
SELECT '周迅', 60
Go
--Start
DECLARE @STR VARCHAR(5000)
SELECT @STR=ISNULL(@STR+',','')+姓名 FROM TBSELECT 姓名,SUM(分数)AS 分数
FROM TB
GROUP BY 姓名 ORDER BY CHARINDEX(','+姓名+',',','+@STR+',')
--Result:
/*(所影响的行数为 4 行)姓名 分数
---------- -----------
李连杰 170
周迅 130(所影响的行数为 2 行)*/
--End
from tb t
from(
select 姓名,分数,row_number() over(order by 姓名) as c
from tb
) t
group by 姓名
order by min(c)1> select * from tb;
2> go
姓名 分数
------ -----------
李连杰 80
李连杰 90
周迅 70
周迅 60(4 rows affected)
1> select 姓名,sum(分数)
2> from(
3> select 姓名,分数,row_number() over(order by 姓名) as c
4> from tb
5> ) t
6> group by 姓名
7> order by min(c);
8> go
姓名
------ -----------
李连杰 170
周迅 130(2 rows affected)
1>
1> select 姓名,sum(分数) from tb group by 姓名;
2> go
姓名
------ -----------
李连杰 170
周迅 130(2 rows affected)
1>
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://forum.csdn.net/BList/OtherDatabase
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试。
-- Author :fredrickhu(小F,向高手学习)
-- Date :2009-12-06 21:04:17
-- 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.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([姓名] varchar(6),[分数] int)
insert [tb]
select '李连杰',80 union all
select '李连杰',90 union all
select '周迅',70 union all
select '周迅',60
--------------开始查询--------------------------
select
distinct 姓名,分数=(select sum(分数) from tb where 姓名=t.姓名)
from
tb t
----------------结果----------------------------
/* 姓名 分数
------ -----------
李连杰 170
周迅 130(2 行受影响)*/
你这个加个distinct就行了
对楼主的数据做了些改变
---------------------------------
-- Author: HEROWANG(让你望见影子的墙)
-- Date : 2009-12-06 21:08:58
---------------------------------
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
go
CREATE TABLE [tb] (姓名 VARCHAR(6),分数 INT)
INSERT INTO [tb]SELECT '周迅',70 UNION ALL
SELECT '周迅',60 UNION ALL
SELECT '李连杰',80 UNION ALL
SELECT '李连杰',90
select * from [tb]select id=identity(int,1,1) ,* into #t from tbselect 姓名,分数=sum(分数)
from (
select *,rnk=case when id=(select min(id) from #t where 姓名=t.姓名) then id
else (select min(id) from #t where 姓名=t.姓名) end
from #t t
)K
group by 姓名,rnk姓名 分数
周迅 130
李连杰 170
declare @tb table (na varchar(100) , sc int)
insert into @tb
select '周迅',70 union all
select '周迅',60 union all
select '李连杰',80 union all
select '李连杰',90
把数据改成这样的话,上面的方法好像都不行哟
大哥,其实我是要实现这样一个功能的:比如表A:
物料 价格
水笔 70
水笔 80
水笔 60
钢笔 90
钢笔 70
钢笔 80 我要通过SQL语句得到表B:如下:
物料 价格1 价格2 价格3
水笔 70 80 60
钢笔 90 70 80
就是得到表B物料的顺序按原表A的。
晕死!
和你一楼对照,完成是风马牛不相及!
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://forum.csdn.net/BList/OtherDatabase
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试。
强烈建议楼主能善待那些真心愿意帮助你的人。
物料 价格
水笔 70
水笔 80
水笔 60
钢笔 90
钢笔 70
钢笔 80 我要通过SQL语句得到表B:如下: 但要注意:[得到表B物料的顺序按原表A的。]
物料 价格1 价格2 价格3
水笔 70 80 60
钢笔 90 70 80
大哥,行列转换是可以的。但要注意:[得到表B物料的顺序按原表A的。]
行列转换做不到这一点呀:[得到表B物料的顺序按原表A的。]
http://topic.csdn.net/u/20091206/22/98323ac1-dc9c-4728-9b68-8509ca25410f.html?74518
if object_id('[tb]') is not null drop table [tb]
create table [tb] (物料 varchar(4),价格 int)
insert into [tb]
select '水笔',70 union all
select '水笔',80 union all
select '水笔',60 union all
select '钢笔',90 union all
select '钢笔',70 union all
select '钢笔',80
go
create proc sp_wsp
as
select id=identity(int,1,1),* into # from [tb]
declare @sql varchar(8000)
set @sql='select 物料'
select @sql=@sql+',[价格'+ltrim(px)+']=max(case px when '+ltrim(px)+'then 价格 else null end)' from
(select distinct px=(select count(*) from # where 物料=a.物料 and id<=a.id) from # a)a
set @sql=@sql+' from (select px=(select count(*) from # where 物料=a.物料 and id<=a.id),* from # a)a group by 物料 order by min(id)'
exec(@sql)
go
exec sp_wsp
--结果:
物料 价格1 价格2 价格3
---- ----------- ----------- -----------
水笔 70 80 60
钢笔 90 70 80
select name,sum(score)
from a
group by name