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
相关文档:
Select
CONVERT(varchar, getdate(), 1),--mm/dd/yy
CONVERT(varchar, getdate(), 2),--yy.mm.dd
CONVERT(varchar, getdate(), 3),--dd/mm/yy
CONVERT(varchar, getdate(), 4),--dd.mm.yy
CONVERT(varchar, getdate(), 5),--dd-mm-yy
CONVERT(varchar, getdate(), 1 ......
数据库 有两张表
表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 ......
to_date和to_char是oracle里里面的内置函数而不是标准的sql语法中的函数,用法举例:
1.to_char,返回结果可显示为各种形式
select to_char(sysdate,'yyyy/mm/dd') ,sysdate from dual;
结果: 2010/05/26 &nbs ......
接上篇
四,根据条件有选择的UPDATE。
例,有如下更新条件
工资5000以上的职员,工资减少10%
工资在2000到4600之间的职员,工资增加15%
很容易考虑的是选择执行两次UPDATE语句,如下所示
--条件1
UPDATE Personnel
SET salary = salary * 0.9
WHERE salary >= 5000;
--条件2
UPDATE Personnel
SET sala ......
关于sql连接语句中的Integrated Security=SSPI
解决方法:
即:Security Support Provider Interface
设置Integrated Security为 True 的时候,连接语句前面的 UserID, PW 是不起作用的,即采用windows身份验证模式。
只有设置为 False 或省略该项的时候,才按照 UserID, PW 来连接。
Integrated Security 可以设置为: ......