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

求条SQL

//考勤表
CREATE TABLE [dbo].[t_scm_comm_attendance](
[id] [varchar](255) ON PRIMARY KEY,
[date] [datetime] NULL,
[real_name] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL //姓名


测试数据

4028b2fb362f419801362d9699aa0004 2012-03-20 00:00:00.000 张三
4028b2fb36300d3101362d7bac4b0002 2012-03-20 00:00:00.000 李斯
4028b2fb363026d701362d69d0b30006 2012-03-20 00:00:00.000 王武
4028b2fb363026d701362d90cf0f000c 2012-03-20 00:00:00.000 赵高
4028b2fb3632c1c90136328fb4080002 2012-03-21 00:00:00.000 李斯
4028b2fb3632c1c9013632a3bbe70007 2012-03-21 00:00:00.000 赵高
//请假登记表
TABLE [dbo].[t_scm_bg_leave_register](
[id] [varchar](255) ON PRIMARY KEY,
[user_name] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL,//姓名
[type] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL,//请假类型
[start_date] [datetime] NULL,//开始时间
[end_date] [datetime] NULL,//结束时间
[stamped] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL,//批准人
[remark] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL//备注
)
05d47c48-11e9-4c0e-b6f2-956364fca302 admin 张三 事假 2012-04-21 00:00:00.000 2012-05-02 00:00:00.000 秦皇




求汇总成

月的出勤统计

姓名 1 2 3 4 5 6 7 8 9 10 11 12 13 。。。。。。29 30 出勤天数 事假 产假 探亲


------解决方案--------------------
动态行列转换,参考一下资料:
SQL code

--行列互转
--摘自中国风博客,引用请标明内容来源
--1、行换列
if object_id('Class') is not  null
    drop table Class
Go
Create table Class(
[Student] nvarchar(2),
[Course] nvarchar(2),
[Score] int)
Insert Class
select N'张三',N'语文',78 union all
select N'张三',N'数学',87 union all
select N'张三',N'英语',82 union all
select N'张三',N'物理',90 union all
select N'李四',N'语文',65 union all
select N'李四',N'数学',77 union all
select N'李四',N'英语',65 union all
select N'李四',N'物理',85 
Go

--2000方法:
--动态:
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='    
   
    +quotename([Course],'''')+' then [Score] else 0 end)'
from 
    Class group by[Course]
--select @s
exec('select [Student]'+@s+' from Class group by [Student]')
--生成静态:
select 
    [Student],
    [数学]=max(case when [Course]='数学' then [Score] else 0 end),
    [物理]=max(case when [Course]='物理' then [Score] else 0 end),
    [英语]=max(case when [Course]='英语' then [Score] else 0 end),
    [语文]=max(case when [Course]='语文' then [Score] else 0 end) 
from 
    Class 
group by [Student]
GO
--动态:

declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]
select @s
exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')

--生成静态:
select * 
from 
    Class 
pivot 
    (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b

--生成格式:
/*
Student 数学         物理         英语         语文
------- ----------- ----------- ----------- -----------
李四     77          85          65          65
张三     87          90          82          78

(2 行受影响)
*/

go
--加上总成绩(学科平均分)

--2000方法:
--动态:

declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+'then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student]'+@s+',[总成绩]=sum([Score])  from Class group by [Student]')--加多一列(学科平均分用avg([Score]))

生成动态:

select 
    [Student],
    [数学]=max(case when [Course]='数学' then [Score] else 0 end),
    [物理]=max(case when [Course]='物理' then [Score] else 0 end),
    [英语]=max(case when [Course]='英语' then [Score] else 0 end),
    [语文]=max(case when [Course]='语文' then [Score] else 0 end),
    [总成绩]=([Score]) --加多一列(学科平均分用avg([Score]))
from 
    Class 
group by [Student]

go

--2005方法:

动态:

declare @s nvarchar(4000)
Select  @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] 
--isnull(@s+',','') 去掉字符串@s中第一个逗号

exec('select [Student],'+@s+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a 
pivot (max([Score]) for [Course] in(