原表
select * from tab
序号 工作号 姓名 类别 标准出勤 实际出勤 额外出勤 考勤日期 更新日期
1 2000019 张三 科长 8 8 0 2010-6-1 0:00 2010-6-5 14:14
2 2000020 李四 处长 8 9 1 2010-6-2 0:00 2010-6-5 14:14
3 2000021 王五 局长 8 8 0 2010-6-3 0:00 2010-6-5 14:15
4 2000019 张三 科长 8 10 0 2010-6-3 0:00 2010-6-6 14:15
想要的结果~第一排的日期是实际出勤工作号 姓名 2010-6-1 2010-6-2 2010-6-3
2000019 张三 8 10
2000020 李四 9
2000021 王五 8
求助高人~~
select * from tab
序号 工作号 姓名 类别 标准出勤 实际出勤 额外出勤 考勤日期 更新日期
1 2000019 张三 科长 8 8 0 2010-6-1 0:00 2010-6-5 14:14
2 2000020 李四 处长 8 9 1 2010-6-2 0:00 2010-6-5 14:14
3 2000021 王五 局长 8 8 0 2010-6-3 0:00 2010-6-5 14:15
4 2000019 张三 科长 8 10 0 2010-6-3 0:00 2010-6-6 14:15
想要的结果~第一排的日期是实际出勤工作号 姓名 2010-6-1 2010-6-2 2010-6-3
2000019 张三 8 10
2000020 李四 9
2000021 王五 8
求助高人~~
解决方案 »
- 我是初学者,今天公司给了一道题目不会求指导
- 添加一万条记录,不允许重复
- 关于将清单汇总的请教
- 怎么让 SQL Server 2000个人版升级到企业版?可以吗 ?
- 有4个列,我想对4个列每行的数据进行比较,然后取最小值,需要什么防防?
- 为什么date类型的不能like查询?
- 怎样知道一个数中有3个(或大于3)连续相同数字的问题
- 请教:有关统计汇总的问题
- 如何把Sql Server中很多结构相同的表批量导成Excel?以及Varchar类型
- sqlserver服务器端的数据库动态下载
- 批处理 执行sql语句
- 我要对字段类型为nvarchar进行sum(),不是数字的默认为0,不能更改表类型,急急,谢谢!!
CREATE TABLE tab (序号 INT, 工作号 INT, 姓名 NVARCHAR(10)
, 类别 NVARCHAR(10), 标准出勤 INT, 实际出勤 INT
, 额外出勤 INT, 考勤日期 DATETIME, 更新日期 DATETIME)
INSERT INTO tab VALUES (1, 2000019, N'张三', N'科长', 8, 8, 0, '2010-6-1 0:00', '2010-6-5 14:14')
INSERT INTO tab VALUES (2, 2000020, N'李四', N'处长', 8, 9, 1, '2010-6-2 0:00', '2010-6-5 14:14')
INSERT INTO tab VALUES (3, 2000021, N'王五', N'局长', 8, 8, 0, '2010-6-3 0:00', '2010-6-5 14:15')
INSERT INTO tab VALUES (4, 2000019, N'张三', N'科长', 8, 10, 0, '2010-6-3 0:00', '2010-6-6 14:15')
DECLARE @sql NVARCHAR(4000)
SET @sql = N'SELECT 工作号,姓名'
SELECT @sql = @sql + N',MAX(CASE WHEN [考勤日期] = ''' + 考勤日期 + N''' THEN 实际出勤 END) AS [' + 考勤日期 + N']'
FROM (SELECT DISTINCT CONVERT(NVARCHAR(10),考勤日期,120)AS 考勤日期 FROM tab)A
SELECT @sql = @sql + N' FROM tab GROUP BY 工作号,姓名'
--PRINT @sql
EXEC (@sql)
非常感谢,如果想要让考勤日期段限制在当前月。
where加在那里呢?
DECLARE @sql NVARCHAR(4000)
SET @sql = N'SELECT 工作号,姓名'
SELECT @sql = @sql + N',MAX(CASE WHEN [考勤日期] = ''' + 考勤日期 + N''' THEN 实际出勤 END) AS [' + 考勤日期 + N']'
FROM (SELECT DISTINCT CONVERT(NVARCHAR(10),考勤日期,120)AS 考勤日期 FROM tab)A
SELECT @sql = @sql + N' FROM tab where GROUP BY 工作号,姓名'
--PRINT @sql
EXEC (@sql)
use PracticeDB
if object_id('[TB]') is not null
drop table [TB]
CREATE TABLE tb (序号 INT, 工作号 INT, 姓名 NVARCHAR(10)
, 类别 NVARCHAR(10), 标准出勤 INT, 实际出勤 INT
, 额外出勤 INT, 考勤日期 DATETIME, 更新日期 DATETIME)
INSERT INTO tb VALUES (1, 2000019, N'张三', N'科长', 8, 8, 0, '2010-6-1 0:00', '2010-6-5 14:14')
INSERT INTO tb VALUES (2, 2000020, N'李四', N'处长', 8, 9, 1, '2010-6-2 0:00', '2010-6-5 14:14')
INSERT INTO tb VALUES (3, 2000021, N'王五', N'局长', 8, 8, 0, '2010-6-3 0:00', '2010-6-5 14:15')
INSERT INTO tb VALUES (4, 2000019, N'张三', N'科长', 8, 10, 0, '2010-6-3 0:00', '2010-6-6 14:15')
select 工作号, 姓名 ,sum(case when CONVERT(varchar(10),考勤日期,120)='2010-06-01' then 实际出勤 else 0 end) as [2010-6-1],
sum(case when CONVERT(varchar(10),考勤日期,120)='2010-06-02' then 实际出勤 else 0 end) as [2010-6-2],
sum(case when CONVERT(varchar(10),考勤日期,120)='2010-06-03' then 实际出勤 else 0 end) as [2010-6-3]
from tb
where left(CONVERT(varchar(7),考勤日期,107),2)=left(CONVERT(varchar(7),GETDATE(),107),2)
group by 工作号, 姓名 工作号 姓名 2010-6-1 2010-6-2 2010-6-3
2000020 李四 0 9 0
2000021 王五 0 0 8
2000019 张三 8 0 10
declare @s nvarchar(max)
set @s=''
select @s=@s+','+QUOTENAME( CONVERT(varchar(10),考勤日期,120))+'= sum( case CONVERT(varchar(10),考勤日期,120) when '''+CONVERT(varchar(10),考勤日期,120)+''' then 实际出勤 else 0 end)'
from tb
group by CONVERT(varchar(10),考勤日期,120)
exec ('select 工作号, 姓名 '+@s+' from tb where left(CONVERT(varchar(7),考勤日期,107),2)=left(CONVERT(varchar(7),GETDATE(),107),2) group by 工作号, 姓名 ')
工作号 姓名 2010-06-01 2010-06-02 2010-06-03
2000020 李四 0 9 0
2000021 王五 0 0 8
2000019 张三 8 0 10
其实第一个人的回复就 可以但是想介于日期之间查询 考勤日期比如 介于DTPicker1 and DTPicker2 之间可以么?
DECLARE @DTPicker2 DATETIMESET @DTPicker1 = '2010-06-1'
SET @DTPicker2 = '2010-06-2'DECLARE @sql NVARCHAR(4000)
SET @sql = N'SELECT 工作号,姓名'
SELECT @sql = @sql + N',MAX(CASE WHEN [考勤日期] = ''' + 考勤日期 + N''' THEN 实际出勤 END) AS [' + 考勤日期 + N']'
FROM (SELECT DISTINCT CONVERT(NVARCHAR(10),考勤日期,120)AS 考勤日期 FROM tab)A
SELECT @sql = @sql + N' FROM tab WHERE 考勤日期 BETWEEN '''
+ CONVERT(NVARCHAR(10),@DTPicker1,120) + N''' AND '''
+ CONVERT(NVARCHAR(10),@DTPicker2,120) + N''' GROUP BY 工作号,姓名'
--PRINT @sql
EXEC (@sql)
GODECLARE @DTPicker1 DATETIME
DECLARE @DTPicker2 DATETIMESET @DTPicker1 = '2010-06-1'
SET @DTPicker2 = '2010-06-2'DECLARE @sql NVARCHAR(4000)
SET @sql = N'SELECT 工作号,姓名'
SELECT @sql = @sql + N',MAX(CASE WHEN [考勤日期] = ''' + 考勤日期 + N''' THEN 实际出勤 END) AS [' + 考勤日期 + N']'
FROM (SELECT DISTINCT CONVERT(NVARCHAR(10),考勤日期,120)AS 考勤日期 FROM tab
WHERE 考勤日期 BETWEEN @DTPicker1 AND @DTPicker2)A
SELECT @sql = @sql + N' FROM tab GROUP BY 工作号,姓名'
--PRINT @sql
EXEC (@sql)
declare @s nvarchar(max),
@DTPicker1 varchar(10),
@DTPicker2 varchar(10)
set @s=''
set @DTPicker1='2010-06-01'
set @DTPicker2='2010-06-30'
select @s=@s+','+QUOTENAME( CONVERT(varchar(10),考勤日期,120))+'= sum( case CONVERT(varchar(10),考勤日期,120) when '''+CONVERT(varchar(10),考勤日期,120)+''' then 实际出勤 else 0 end)'
from tb
group by CONVERT(varchar(10),考勤日期,120)
exec ('select 工作号, 姓名 '+@s+' from tb where CONVERT(varchar(10),考勤日期,120) >= '''+ @DTPicker1 +''' and CONVERT(varchar(10),考勤日期,120) <= '''+ @DTPicker2 +''' group by 工作号, 姓名 ')