假设有表
create table 考勤
(
人员 varchar(10),
日期 varchar(8),
签到 varchar(2)
)
insert into 考勤 values('张三', '20140901', '是')
insert into 考勤 values('张三', '20140902', '否')
insert into 考勤 values('李四', '20140901', '是')
select * from 考勤
人员 日期 签到
张三 20140901 是
张三 20140902 否
李四 20140901 是
select * from 考勤
pivot(max(签到) for 人员 in(张三, 李四)) 日期
日期 张三 李四
20140901 是 是
20140902 否 NULL
更新:
今天正好有碰到一个需求用了这个方法,把例子和语句放上来
select * from
(
select substring(examdate, 1, 6) as 月份,rrq.EndoscopyType ,COUNT(*) as 工作量
from ris_request rrq
where rrq.ModalityRemark=''US'' and rrq.ExamDate>''20130101''
group by rrq.EndoscopyType,substring(examdate, 1, 6)
这个是原先的语句和结果集
月份 EndoscopyType 工作量
201407 NULL 1
201407 3
201407 GE Vivid E9 2
201408 GE Vivid E9 1
201408 PHILIPS CX50 6
201409 4
201409 PHILIPS CX50 7
201409 飞利浦心超 IE33 1
201410 6
201410 PHILIPS M2540A 4
201410 飞利浦心超 IE33 1
统计每个月每个超声设备的工作量,需求要求将设备固定在第一列,以月份作为剩下的列,每个结果为该设备当月的工作量
declare @exammonthrange varchar(1000)
declare @sql varchar(6000)
set @exammonthrange = ''
select @exammonthrange = @exammonthrange + '[' + 月份 + '],'
from (
select distinct SUBSTRING(RIS_REQUEST.ExamDate,1, 6) as 月份
from ris_request
where ModalityRemark='US' and RIS_REQUEST.ExamDate>'20130101'
) as 月份表
print @exammonthrange
if(LEN(@exammonthrange) > 0)
begin
set @exammonthrange = SUBSTRING(@exammonthrange, 1, LEN(@exammonthrange) - 1);
print @exammonthrange;
set @sql =
'select * from
(
select substring(examdate, 1, 6) as 月份,rrq.EndoscopyType ,COUNT(*) as 工作量
from ris_request rrq
where rrq.ModalityRemark=''US'' and rrq.ExamDate>''20130101''
group by rrq.EndoscopyType,substring(examdate, 1, 6)
) as A
pivot(max(工作量) for 月份 in (' + @exammonthrange + ')) EndoscopyType';
print @sql;
exec(@sql)
end
EndoscopyType 201407 201408 201409 201410
NULL 1 NULL NULL NULL
3 NULL 4 6
GE Vivid E9 2 1 NULL NULL
PHILIPS CX50 NULL 6 7 NULL
PHILIPS M2540A NULL NULL NULL 4
飞利浦心超 IE33 NULL NULL 1 1