日期:2014-05-18  浏览次数:20396 次

SQL数据库查询 该怎样写? 源自一道数据库笔试题目
题目:有如下表
table1
月份 部门 业绩
-------------------------------
一月份 01 10
一月份 02 10
一月份 03 5
二月份 02 8
二月份 04 9
三月份 03 8

为了得出下面的表,该怎样写查询语句?
部门 一月份 二月份 三月份
---------- ------ ------ ------
01 10 NULL NULL
02 10 8 NULL
03 5 NULL 8
04 NULL 9 NULL

我自己试着写了一下,发现写了5、6个单独的select语句才能得出下表的结果(⊙﹏⊙b汗)
各位高手看看,有没有其他简单的方式完成这道题目?


------解决方案--------------------
我上面第一段中写错了点.
更改为如下:
SQL code
create table table1(月份 varchar(10),部门 varchar(10),业绩 int) 
insert into table1 values('一月份', '01', 10)
insert into table1 values('一月份', '02', 10)
insert into table1 values('一月份', '03', 5)
insert into table1 values('二月份', '02', 8)
insert into table1 values('二月份', '04', 9)
insert into table1 values('三月份', '03', 8)
go

--如果你的月份仅仅是这三个月,则如下:
select 部门,
       sum(case 月份 when '一月份' then 业绩 else 0 end) [一月份],
       sum(case 月份 when '二月份' then 业绩 else 0 end) [二月份],
       sum(case 月份 when '三月份' then 业绩 else 0 end) [三月份]
from table1
group by 部门
/*
部门         一月份         二月份         三月份         
---------- ----------- ----------- ----------- 
01         10          0           0
02         10          8           0
03         5           0           8
04         0           9           0

(所影响的行数为 4 行)
*/ 

--如果你的月份不止这三个月,则如下:
declare @sql varchar(8000)
set @sql = 'select 部门 '
select @sql = @sql + ' , sum(case 月份 when ''' + 月份 + ''' then 业绩 else 0 end) [' + 月份 + ']'
from (select distinct 月份 from table1) as a
set @sql = @sql + ' from table1 group by 部门'
exec(@sql) 

/*
部门         一月份         二月份         三月份         
---------- ----------- ----------- ----------- 
01         10          0           0
02         10          8           0
03         5           0           8
04         0           9           0

(所影响的行数为 4 行)
*/
drop table table1

------解决方案--------------------
/*
题目:有如下表
table1
月份 部门 业绩
-------------------------------
一月份 01 10
一月份 02 10
一月份 03 5
二月份 02 8
二月份 04 9
三月份 03 8

为了得出下面的表,该怎样写查询语句?
部门 一月份 二月份 三月份
---------- ------ ------ ------
01 10 NULL NULL
02 10 8 NULL
03 5 NULL 8
04 NULL 9 NULL
*/

go
if OBJECT_ID('tbl')is not null
drop table tbl
go
create table tbl(
月份 varchar(6),
部门 varchar(2),
业绩 int
)
go
insert tbl
select '一月份','01',10 union all
select '一月份','02',10 union all
select '一月份','03',5 union all
select '二月份','02',8 union all
select '二月份','04',9 union all
select '三月份','03',8

declare @str varchar(2000)
set @str=''
select @str=@str+','+'sum(case when 月份='+quotename(月份,'''')+
' then 业绩 else 0 end) as '+月份 from tbl group by 月份
print @str
set @str='select 部门'+@str+' from tbl group by 部门'
exec(@str)
/*
部门 二月份 三月份 一月份
01 0 0 10
02 8 0 10
03 0 8 5
04 9 0 0
*/