+ -
当前位置:首页 → 问答吧 → 【sql行列转换】这一条怎么该怎么写?

【sql行列转换】这一条怎么该怎么写?

时间:2011-12-05

来源:互联网

SQL code
if exists (select * from sysobjects where id = OBJECT_ID('[test]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) 
DROP TABLE [test]

CREATE TABLE [test] (
[自增id] [int]  IDENTITY (1, 1)  NOT NULL,
[姓名] [varchar]  (50) NULL,
[日期] [datetime]  NULL,
[是否准时] [varchar]  (50) NULL,
[上班下班] [varchar]  (50) NULL)

SET IDENTITY_INSERT [test] ON

INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 1,N'张三',N'2011-10-01 00:00:00',N'1',N'上班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 2,N'张三',N'2011-10-01 00:00:00',N'1',N'下班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 3,N'李四',N'2011-10-01 00:00:00',N'1',N'上班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 4,N'李四',N'2011-10-01 00:00:00',N'0',N'下班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 5,N'张三',N'2011-10-02 00:00:00',N'0',N'上班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 6,N'张三',N'2011-10-02 00:00:00',N'1',N'下班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 7,N'李四',N'2011-10-02 00:00:00',N'1',N'上班')

SET IDENTITY_INSERT [test] OFF


自增id    姓名    日期    是否准时    上班下班
1    张三    2011-10-01 00:00:00.000    1    上班
2    张三    2011-10-01 00:00:00.000    1    下班
3    李四    2011-10-01 00:00:00.000    1    上班
4    李四    2011-10-01 00:00:00.000    0    下班
5    张三    2011-10-02 00:00:00.000    0    上班
6    张三    2011-10-02 00:00:00.000    1    下班
7    李四    2011-10-02 00:00:00.000    1    上班


-----------------------------------------------------------
提示
“1” 表示 考勤   
“0” 表示 未考勤(迟到或者 早退 )
每人每天应有两条考勤记录,若无就为未登记。



获取下表
----------------------------------------------------------
姓名   2011-10-1      2011-10-02   
张三   正常考勤       迟到
张三   正常考勤       正常考勤
李四    正常考勤      正常考勤    
李四    早退          未登记              

-------------------
如何 通过一条sql 语句 实现,sql语句实在无法实现用存储过程也可以。

作者: chz415767975   发布时间: 2011-12-05

动态行转列.

作者: qianjin036a   发布时间: 2011-12-05

SQL code

declare @sql varchar(8000)
set @sql = 'select [姓名],[上班下班]'
select @sql = @sql + ' , max(case  convert(varchar(10),[日期],120) when ''' + 
convert(varchar(10),[日期],120)+ ''' then 
case when [是否准时]=1 then ''正常考勤'' when [是否准时]=0 and [上班下班]=''上班'' then ''迟到''
when [是否准时]=0 and [上班下班]=''下班'' then ''早退'' end 
else ''weidengji'' end) [' 
+ convert(varchar(10),[日期],120)+ ']'
from (select distinct [日期] from [test]) as a
set @sql = @sql + ' from [test] group by [姓名],[上班下班] order by 1 desc'
exec(@sql) 

作者: maco_wang   发布时间: 2011-12-05

做好通过程序处理,自动拼接的sql语句,很容易超过8000

作者: koumingjie   发布时间: 2011-12-05

SQL code
CREATE TABLE [test] (
[自增id] [int]  IDENTITY (1, 1)  NOT NULL,
[姓名] [varchar]  (50) NULL,
[日期] [datetime]  NULL,
[是否准时] [varchar]  (50) NULL,
[上班下班] [varchar]  (50) NULL)
SET IDENTITY_INSERT [test] ON
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 1,N'张三',N'2011-10-01 00:00:00',N'1',N'上班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 2,N'张三',N'2011-10-01 00:00:00',N'1',N'下班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 3,N'李四',N'2011-10-01 00:00:00',N'1',N'上班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 4,N'李四',N'2011-10-01 00:00:00',N'0',N'下班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 5,N'张三',N'2011-10-02 00:00:00',N'0',N'上班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 6,N'张三',N'2011-10-02 00:00:00',N'1',N'下班')
INSERT [test] ([自增id],[姓名],[日期],[是否准时],[上班下班]) VALUES ( 7,N'李四',N'2011-10-02 00:00:00',N'1',N'上班')
go
select c.姓名,convert(varchar(10),c.日期,120)日期,c.上班下班,
(case when d.是否准时=1 then '正常考勤' 
when d.是否准时=0 and c.上班下班='上班' then '迟到' 
when d.是否准时=0 and c.上班下班='下班' then '早退'
else '未登记' end) 状态 into #t
from(
select a.姓名,b.日期,b.上班下班
from (select distinct 姓名 from test)a,
(select distinct 日期,上班下班 from test)b
)c left join test d on c.姓名=d.姓名 and c.日期=d.日期 and c.上班下班=d.上班下班

declare @sql nvarchar(4000)
set @sql=''
Select @sql=@sql+','+quotename(日期)+'=max(case when 日期='''+日期+''' then 状态 else '''' end)'
from #t where 上班下班='上班' group by 日期
exec('select 姓名 '+@sql+' from #t where 上班下班=''上班'' group by 姓名 union all select 姓名 '+@sql+' from #t where 上班下班=''下班'' group by 姓名 order by 1,2 desc')
/*
姓名                                                 2011-10-01 2011-10-02
-------------------------------------------------- ---------- ----------
李四                                                 正常考勤       正常考勤
李四                                                 早退         未登记
张三                                                 正常考勤       迟到
张三                                                 正常考勤       正常考勤

(4 行受影响)

*/
go
drop table test,#t


作者: qianjin036a   发布时间: 2011-12-05