--
常见
sql
高级运用
--
本文主要讲述
sql server2005
在日常的运用
--
我们建立一张部门表进行测试
if
exists
(
select
*
from
sysobjects where
[name]=
'partment'
)
begin
drop
table
partment
end
go
create
table
partment
(
pid int
identity
(
1,
1),
pname varchar
(
30)
not
null,
pperson int
not
null
)
go
--
建立约束
alter
table
partment
add
constraint
primary
key
(
pid)
--
添加数据
insert
partment
select
'
技术部
'
,
80
union
all
select
'
行政部
'
,
20
union
all
select
'
企管部
'
,
70
union
all
select
'
商管部
'
,
60
go
select
*
from
partment
go
--
删除表中重复的行
/*
分析:
删除重复的行的过程中,主要在于找到数据表中的重复列,然后进行删除。
对本列在于找到部门名称相同的数据
,
通过聚合函数
max
、
group by
和
having
可以方便的找出重复的行。
select max(pid) as
部门编号
from partment group by pname having count(pname)>0
这样就有方法解决了
*/
--
解决方法
delete from partment
where pid not in ( select min ( pid) from partment group by pname having count ( pname)> 0)
go
/*
在
ms sql
中我们知道
max
和
min
相反可以得到最大和最小的记录这里看需求,另外
top
亦可以得到
-
个结果,
这样我们就可以演变出其他方法。不过在
sql
里面不提倡运用
not
这样会降低效率。所有我们在这里运用
exists
来查询
提高效率。
*/
--
解决方法
delete
p from
partment as
p
where exists( select pid from partment where pname = p. pname and pid > p. pid)
go
/*
在日常运用中会有客户要求报表不仅可以横看而且也可以竖看,这样我们就要将行和列转换,
由于表结构不能支持本例,这样我们用
alter
更改表结构
*/
--
增加表结构中的列
/*
alter table [table_name]
add culumn_name column_type
*/
alter
table
partment add
company varchar
(
30)
go
update
partment set
company =
'xxxx
公司
'
go
-- 引申:更改数据表中的列: alter table partment alter column pperson varchar(30)
--
行转换成列
--
在这里我们用最适用的方法
declare
@sql nvarchar
(
1000)
select
@sql =
'select company as
公司
'
select
@sql =
@sql +
',sum( case when pname ='''
+
cast
(
pname as
varchar
)+
''' then pperson end) as '
+
pname from
partment group
by
pname
select @sql = @sql + ' from partment group by company'
print
@sql
exec
@sql
select
company as
公司
,
sum
(
case
when
pname =
'
技术部
'
then
pperson end
)
as
技术部
,
sum
(
case
when
pname =
'
企管部
'
then
pperson end
)
as
企管部
,
sum
(
case
when
pname =
'
行政部
'
then
pperson end
)
as
行政部
from
partment
group
by
company
declare @test table (id int,name varchar(20),quarter int,profile int)
insert into @test values(1,'a',1,1000)
insert into @test values(1,'a',2,2000)
insert into @test values(1,'a',3,4000)
insert into @test values(1,'a',4,5000)
insert into @test values(2,'b',1,3000)
insert into @test values(2,'b',2,3500)
insert into @test values(2,'b',3,4200)
insert into @test values(2,'b',4,5500)
select * from @test
--行转列
select id,name,
[1] as "一季度",
[2] as "二季度",
[3] as "三季度",
[4] as "四季度",
[5] as "5"
from
@test
pivot
(
sum(profile)
for quarter in
([1],[2],[3],[4],[5])
)
as pvt
declare @test2 table (id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int)
insert into @test2 values(1,'a',1000,2000,4000,5000)
insert into @test2 values(2,'b',3000,3500,4200,5500)
select * from @test2
--列转行
select id,name,quarter,profile
from
@test2
unpivot
(
profile
for quarter in
([Q1],[Q2],[Q3],[Q4])
)
as unpvt
本文介绍 SQL Server 2005 的实用技巧,包括如何创建和管理数据库表、处理重复数据及数据转换等操作。
1621

被折叠的 条评论
为什么被折叠?



