这个可以排序啊,之前不是处理好了吗
如果subject 是varchar,且符合 科目1 科目2 用以下语句
declare @sql varchar(8000)
DECLARE @TOTALSQL VARCHAR(8000)
set @sql = 'select Name as ' + '姓名'
SET @TOTALSQL = ' UNION ALL select ''合计'''
;WITH tb(NAME,SUBJECT,Result) AS(
SELECT'a','科目1',90
UNION ALL SELECT'a','科目12',90
UNION ALL SELECT'a','科目3',90
)
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
, @TOTALSQL = @TOTALSQL + ' , sum(case Subject when ''' + Subject + ''' then Result else 0 end)'
from (SELECT ROW_NUMBER()OVER(ORDER BY CAST(SUBSTRING(Subject,3,LEN(Subject)) AS INT))RN, Subject from tb GROUP BY Subject) as a ORDER BY RN
set @sql = @sql + ' , ISNULL(sum(Result),0)[学生总分] from tb group by name '
set @TOTALSQL = @TOTALSQL + ' , ISNULL(sum(Result),0) from tb'
SET @sql=@sql+@TOTALSQL
SET @SQL=';WITH tb(NAME,SUBJECT,Result) AS(
SELECT''a'',''语文'',90
)'+@sql
PRINT @sql
exec(@sql)如果subject 是int,用以下语句
declare @sql varchar(8000)
DECLARE @TOTALSQL VARCHAR(8000)
set @sql = 'select No as [学号], Name as [姓名]'
SET @TOTALSQL = ' UNION ALL select '''',''合计'''
select @sql = @sql + ' , sum(case Subject when ''' + CAST(Subject AS VARCHAR(10)) + ''' then Result else 0 end) [' + CAST(Subject AS VARCHAR(10)) + ']'
, @TOTALSQL = @TOTALSQL + ' , sum(case Subject when ''' + CAST(Subject AS VARCHAR(10)) + ''' then Result else 0 end)'
from (select Subject from tb GROUP BY Subject) as a
set @sql = @sql + ' , ISNULL(sum(Result),0)[学生总分] from tb group by No,name '
set @TOTALSQL = @TOTALSQL + ' , ISNULL(sum(Result),0) from tb'
SET @sql=@sql+@TOTALSQL
--PRINT @sql
exec(@sql)
如果subject 是varchar,且符合 科目1 科目2 用以下语句
declare @sql varchar(8000)
DECLARE @TOTALSQL VARCHAR(8000)
set @sql = 'select Name as ' + '姓名'
SET @TOTALSQL = ' UNION ALL select ''合计'''
;WITH tb(NAME,SUBJECT,Result) AS(
SELECT'a','科目1',90
UNION ALL SELECT'a','科目12',90
UNION ALL SELECT'a','科目3',90
)
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
, @TOTALSQL = @TOTALSQL + ' , sum(case Subject when ''' + Subject + ''' then Result else 0 end)'
from (SELECT ROW_NUMBER()OVER(ORDER BY CAST(SUBSTRING(Subject,3,LEN(Subject)) AS INT))RN, Subject from tb GROUP BY Subject) as a ORDER BY RN
set @sql = @sql + ' , ISNULL(sum(Result),0)[学生总分] from tb group by name '
set @TOTALSQL = @TOTALSQL + ' , ISNULL(sum(Result),0) from tb'
SET @sql=@sql+@TOTALSQL
SET @SQL=';WITH tb(NAME,SUBJECT,Result) AS(
SELECT''a'',''语文'',90
)'+@sql
PRINT @sql
exec(@sql)如果subject 是int,用以下语句
declare @sql varchar(8000)
DECLARE @TOTALSQL VARCHAR(8000)
set @sql = 'select No as [学号], Name as [姓名]'
SET @TOTALSQL = ' UNION ALL select '''',''合计'''
select @sql = @sql + ' , sum(case Subject when ''' + CAST(Subject AS VARCHAR(10)) + ''' then Result else 0 end) [' + CAST(Subject AS VARCHAR(10)) + ']'
, @TOTALSQL = @TOTALSQL + ' , sum(case Subject when ''' + CAST(Subject AS VARCHAR(10)) + ''' then Result else 0 end)'
from (select Subject from tb GROUP BY Subject) as a
set @sql = @sql + ' , ISNULL(sum(Result),0)[学生总分] from tb group by No,name '
set @TOTALSQL = @TOTALSQL + ' , ISNULL(sum(Result),0) from tb'
SET @sql=@sql+@TOTALSQL
--PRINT @sql
exec(@sql)
go
--> -->
if not object_id(N'tb') is null
drop table tb
Go
Create table tb([No] nvarchar(2),[Name] nvarchar(2),[Subject] int,[Result] int)
Insert tb
select N'01',N'张三',1,74 union all
select N'01',N'张三',2,83 union all
select N'01',N'张三',3,93 union all
select N'02',N'李四',1,74 union all
select N'02',N'李四',2,84 union all
select N'02',N'李四',3,94
Go
declare @sql nvarchar(4000)
set @sql=''
Select @sql=@sql+','+quotename(N'科目'+RTRIM([Subject]))+'=max(case when [Subject]='+RTRIM([Subject])+' then [Result] else 0 end)'
FROM tb
group BY [Subject]
exec('select [No]=isnull([No],''''),[Name]=isnull([Name],N''合计'')'+@sql+' from tb group by [No],[Name] with rollup having grouping([No])=1 or grouping([Name])=0')
/*
No Name 科目1 科目2 科目3
01 张三 74 83 93
02 李四 74 84 94
合计 74 84 94
*/
select distinct subject from tb 更换掉了
select Subject from tb GROUP BY Subject,其它没有变,我周五试过,是排不了序的。数据库不在我这里,我周一再试试吧。
多谢你的耐心解答。
你试下这个语句,看是不是正常的显示 1 2 3
以下语句单独执行
SELECT * FROM(SELECT 3 INTID UNION ALL SELECT 1 UNION ALL SELECT 2)T1 ORDER BY INTID
Select @sql=@sql+','+quotename(N'科目'+RTRIM([Subject]))+'=sum(case when [Subject]='+RTRIM([Subject])+' then [Result] else 0 end)'
FROM tb
group BY [Subject]
order by [Subject]
上面这句group by subject 是归类,也没有排序呀,如果加上 order by subject 又报错。
2楼提供的语句是可以排序
SELECT * FROM(SELECT 3 INTID UNION ALL SELECT 1 UNION ALL SELECT 2)T1 ORDER BY INTID
不能排序时?没有楼主对应的环境,是测不出来的。
在语句上直接加Order By就行了use Tempdb
go
--> -->
if not object_id(N'tb') is null
drop table tb
Go
Create table tb([No] nvarchar(2),[Name] nvarchar(2),[Subject] int,[Result] int)
Insert tb
select N'01',N'张三',1,74 union all
select N'01',N'张三',2,83 union all
select N'01',N'张三',3,93 union all
select N'02',N'李四',1,74 union all
select N'02',N'李四',2,84 union all
select N'02',N'李四',3,94
Go
declare @sql nvarchar(4000)
set @sql=''
Select @sql=@sql+','+quotename(N'科目'+RTRIM([Subject]))+'=sum(case when [Subject]='+RTRIM([Subject])+' then [Result] else 0 end)'
FROM tb
group BY [Subject]
exec('select [No]=isnull([No],''''),[Name]=isnull([Name],N''合计'')'+@sql+',[总成绩]=sum([Result]) from tb group by [No],[Name] with rollup having grouping([No])=1 or grouping([Name])=0 order by grouping([No]) asc,[总成绩] desc')
/*
No Name 科目1 科目2 科目3 总成绩
02 李四 74 84 94 252
01 张三 74 83 93 250
合计 148 167 187 502
*/