关于三条记录集合为一条记录的问题

nnh 2006-04-21 10:59:53
在DataGrid中显示的数据如下 :

编号 姓名 打卡日期 打卡时间
A01 A 03/01/06 12:18
A01 A 03/01/06 13:22
A01 A 03/01/06 17:29


以上表有三行,现在想只汇总一条记录,为:

编号 姓名 打卡日期 打卡时间1 打卡时间2 打卡时间3
A01 A 03/01/06 12:18 13:22 17:29

请问代码该怎样写呢?谢谢.
...全文
176 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaoanle 2006-04-21
  • 打赏
  • 举报
回复
动态SQL
依打卡次数多少确定列数
zhaoanle 2006-04-21
  • 打赏
  • 举报
回复
create table #t(编号 varchar(10),姓名 varchar(10),打卡日期 datetime,打卡时间 varchar(5))
insert #t select 'A01', 'A', '03/01/06', '12:18'
insert #t select 'A01', 'A', '03/01/06', '13:22'
insert #t select 'A01', 'A', '03/01/06', '17:29'
insert #t select 'A01', 'A', '03/01/06', '18:18'
insert #t select 'A01', 'A', '03/01/06', '19:22'
insert #t select 'A01', 'A', '03/01/06', '20:29'
insert #t select 'B01', 'B', '03/01/06', '12:18'
insert #t select 'B01', 'B', '03/01/06', '13:22'
insert #t select 'B01', 'B', '03/01/06', '17:29'

declare @sql varchar(8000)
set @sql='select b.编号,b.姓名,b.打卡日期,'
select @sql=@sql+'打卡时间'+cast(b.id as varchar(10))+'=max(case when b.id='+cast(b.id as varchar(10))+' then 打卡时间 end),'
from
(select id=(select count(*) from #t where 编号=a.编号 and 打卡日期=a.打卡日期 and 打卡时间>=a.打卡时间),* from #t a) b
group by b.id
set @sql=left(@sql,len(@sql)-1)
+' from (select id=(select count(*) from #t where 编号=a.编号 and 打卡日期=a.打卡日期 and 打卡时间>=a.打卡时间),* from #t a) b
group by b.编号,b.姓名,b.打卡日期'
exec(@sql)


drop table #t

/*结果

编号 姓名 打卡日期 打卡时间1 打卡时间2 打卡时间3 打卡时间4 打卡时间5 打卡时间6
---------- ---------- ------------------------------ ----- ----- ----- ----- ----- -----
A01 A 2003-01-06 00:00:00.000 20:29 19:22 18:18 17:29 13:22 12:18
B01 B 2003-01-06 00:00:00.000 17:29 13:22 12:18 NULL NULL NULL

警告: 聚合或其它 SET 操作消除了空值。
*/
nnh 2006-04-21
  • 打赏
  • 举报
回复
谢谢zhaoanle(zhao)
你给的代码可以做到,可现在如果一天A 打了5资,B才打了3次,用你的代码就会出现问题,请问你可以帮忙解决吗?也就是说一个人一天打卡次数是不固定的.谢谢.
zhaoanle 2006-04-21
  • 打赏
  • 举报
回复
create table #t(编号 varchar(10),姓名 varchar(10),打卡日期 datetime,打卡时间 varchar(10))
insert #t select 'A01', 'A', '03/01/06', '12:18'
insert #t select 'A01', 'A', '03/01/06', '13:22'
insert #t select 'A01', 'A', '03/01/06', '17:29'
insert #t select 'B01', 'B', '03/01/06', '12:18'
insert #t select 'B01', 'B', '03/01/06', '13:22'
insert #t select 'B01', 'B', '03/01/06', '17:29'


select b.编号,b.姓名,b.打卡日期,
打卡时间1=max(case when b.id=1 then 打卡时间 end),
打卡时间2=max(case when b.id=2 then 打卡时间 end),
打卡时间3=max(case when b.id=3 then 打卡时间 end)
from
(select id=(select count(*) from #t where 编号=a.编号 and 打卡日期=a.打卡日期 and 打卡时间>=a.打卡时间),* from #t a) b
group by b.编号,b.姓名,b.打卡日期

drop table #t


/*结果

编号 姓名 打卡日期 打卡时间1 打卡时间2 打卡时间3
---------- ---------- --------------------------------- ---------- ---------- ----------
A01 A 2003-01-06 00:00:00.000 17:29 13:22 12:18
B01 B 2003-01-06 00:00:00.000 17:29 13:22 12:18

(所影响的行数为 2 行)*/
nnh 2006-04-21
  • 打赏
  • 举报
回复
我在机子上试了第二种方式的代码,都是有点错误,高手帮看看呀:

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '?' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '?' 附近有语法错误。
sublx 2006-04-21
  • 打赏
  • 举报
回复
select id=(select count(*) from #t where 编号=a.编号 and 打卡日期=a.打卡日期 and 打卡时间>=a.打卡时间),* from #t a
问一下,这条语句是什么意思...?汉一下自己!
3 A01 A 2003-01-06 00:00:00.000 12:18
2 A01 A 2003-01-06 00:00:00.000 13:22
1 A01 A 2003-01-06 00:00:00.000 17:29
3 B01 B 2003-01-06 00:00:00.000 12:18
2 B01 B 2003-01-06 00:00:00.000 13:22
1 B01 B 2003-01-06 00:00:00.000 17:29
不明白为什么id会出现123这写值~~我以为会出现id=6!!!忘回答....
xeqtr1982 2006-04-21
  • 打赏
  • 举报
回复
--修改一下zhaoanle(zhao)的代码,把>=换成<=就可以了
create table #t(编号 varchar(10),姓名 varchar(10),打卡日期 datetime,打卡时间 varchar(5))
insert #t select 'A01', 'A', '03/01/06', '12:18'
insert #t select 'A01', 'A', '03/01/06', '13:22'
insert #t select 'A01', 'A', '03/01/06', '17:29'
insert #t select 'A01', 'A', '03/01/06', '18:18'
insert #t select 'A01', 'A', '03/01/06', '19:22'
insert #t select 'A01', 'A', '03/01/06', '20:29'
insert #t select 'B01', 'B', '03/01/06', '12:18'
insert #t select 'B01', 'B', '03/01/06', '13:22'
insert #t select 'B01', 'B', '03/01/06', '17:29'

declare @sql varchar(8000)
set @sql='select b.编号,b.姓名,b.打卡日期,'
select @sql=@sql+'打卡时间'+cast(b.id as varchar(10))+'=max(case when b.id='+cast(b.id as varchar(10))+' then 打卡时间 end),'
from
(select id=(select count(*) from #t where 编号=a.编号 and 打卡日期=a.打卡日期 and 打卡时间<=a.打卡时间),* from #t a) b
group by b.id
set @sql=left(@sql,len(@sql)-1)
+' from (select id=(select count(*) from #t where 编号=a.编号 and 打卡日期=a.打卡日期 and 打卡时间<=a.打卡时间),* from #t a) b
group by b.编号,b.姓名,b.打卡日期'
exec(@sql)

drop table #t
nnh 2006-04-21
  • 打赏
  • 举报
回复
还有一点,怎么晚上打的会显示在"打卡时间1 "上呢?最后打的应该在最后显示的打卡时间上吧.
nnh 2006-04-21
  • 打赏
  • 举报
回复
我就是直按复制的了,放到sql查询分析器中:
create table #t(编号 varchar(10),姓名 varchar(10),打卡日期 datetime,打卡时间 varchar(5))
insert #t select 'A01', 'A', '03/01/06', '12:18'
insert #t select 'A01', 'A', '03/01/06', '13:22'
insert #t select 'A01', 'A', '03/01/06', '17:29'
insert #t select 'A01', 'A', '03/01/06', '18:18'
insert #t select 'A01', 'A', '03/01/06', '19:22'
insert #t select 'A01', 'A', '03/01/06', '20:29'
insert #t select 'B01', 'B', '03/01/06', '12:18'
insert #t select 'B01', 'B', '03/01/06', '13:22'
insert #t select 'B01', 'B', '03/01/06', '17:29'

declare @sql varchar(8000)
set @sql='select b.编号,b.姓名,b.打卡日期,'
select @sql=@sql+'打卡时间'+cast(b.id as varchar(10))+'=max(case when b.id='+cast(b.id as varchar(10))+' then 打卡时间 end),'
from
(select id=(select count(*) from #t where 编号=a.编号 and 打卡日期=a.打卡日期 and 打卡时间>=a.打卡时间),* from #t a) b
group by b.id
set @sql=left(@sql,len(@sql)-1)
+' from (select id=(select count(*) from #t where 编号=a.编号 and 打卡日期=a.打卡日期 and 打卡时间>=a.打卡时间),* from #t a) b
group by b.编号,b.姓名,b.打卡日期'
exec(@sql)


drop table #t
xeqtr1982 2006-04-21
  • 打赏
  • 举报
回复
zhaoanle(zhao)的代码没问题。你把你的代码贴出来看看
nnh 2006-04-21
  • 打赏
  • 举报
回复
我运行了你的代码,出现:

(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 1 行)

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '?' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '?' 附近有语法错误。


有错误,你帮忙看一下,谢谢.

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧