Sql Sever记录的行列转换
已知一个表的结构为:
姓名 科目 成绩
张三 语文 20
张三 数学 30
张三 英语 50
李四 语文 70
李四 数学 60
李四 英语 90
怎样通过select语句把他变成以下结构:
姓名 语文 数学 英语
张三 20 30 50
李四 70 60 90
答:
CREATE TABLE [dbo].[Stu] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Class] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[score] [int] NOT NULL
) ON [PRIMARY]
GO
select * from Stu
insert into Stu values('马里','语文',80)
insert into Stu values('马里','数学',96)
insert into Stu values('付帅','语文',85)
insert into Stu values('付帅','数学',85)
insert into Stu values('唐子意','语文',30)
insert into Stu values('唐子意','数学',50)
insert into Stu values('王海辰','英语',35)
declare @sql nvarchar(4000)
set @sql=''
select @sql = @sql + ',sum(case class when '''+ class + ''' then score else 0 end) as ' +class from stu group by class
set @sql = 'select name '+@sql+' from stu group by name'
print @sql
exec(@sql)
(
可以试试这个:
declare @sql nvarchar(4000)
set @sql=''
select @sql = @sql + class from stu
print @sql
)
另一种:
--创建存储过程
create proc dbo.usp_data
as
--定义一个游标
DECLARE cur_class CURSOR
FOR
--从stu表中获得所有的科目并且排序
SELECT distinct class from stu ORDER BY class
--打开游标
OPEN cur_class
--定义游标循环的行数
DECLARE @cursor_row INT
--定义循环过程中需要的获得的科目名称,用此变量保存
DECLARE @class nvarchar(100)
--设置游标的行数
SET @cursor_row = @@CURSOR_ROWS
--定义循环中需要拼接的字符串
declare @sql nvarchar(4000)
declare @insert_sql nvarchar(4000)
declare @case_sql nvarchar(4000)
declare @sum_sql nvarchar(4000)
--创建临时表的语句固定部分
set @sql = 'create table #temp (姓名 nvarchar(100),'
set @insert_sql = 'insert into #temp(姓名,'
set @case_sql = ''
set @sum_sql = ''
--print @cursor_row
--按照游标循环,即按科目循环
WHILE(@cursor_row > 0)
BEGIN
SET @cursor_row = @cursor_row - 1
FETC
相关文档:
数据库 有两张表
表1: student
表2:chinese
现在要分别列出 每所学校 语文成绩最高的 学生信息
SQL :
SELECT *
from student
LEFT JOIN chinese ON student.no = chinese.no
WHERE chinese.chengji
IN (
SELECT max( chinese.chengji )
from student
LEFT JOIN chinese ON student.no = chinese.no
GROU ......
怎样从数据库里随机读取
一条记录,
SELECT TOP 1 * from dbo.Customers ORDER BY NEWID()
这样,如果是随机10
条,100条。。。。
SELECT TOP 10 * from dbo.Customers ORDER BY NEWID()
很简单吧。
不过top后面数字越大,运行速度越慢。不推荐数据字太大。
以后代码在SQL2000 ......
使用SQL Server的朋友們應該都知道SQL Server的資料庫有一個設定叫做定序(Collation),今天我們就來看看定序這東西是什麼,首先我們看一下Wiki上對定序的說明:
Collation is the assembly of written information into a sta ......
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
这两种方式,可以实现相同的功能。简单Case函数的写法 ......
对于很多DBA和程序员来说,SQL Server中的索引不是一个陌生的事物,我们甚至每天都在使用它,对于哪些情况下应该创建索引都能一一的道出,不过有可能我们并没有仔细去想它的具体原理,本文将根据我对SQL Server中的索引的理解做一个简单的总结和概述,希望对大家能有所帮助(详细可参考《SQL Server 2005 Implementation an ......