SQL查询

山那頭 2017-01-11 11:25:00
求大神看下,SQL表中的数据,如何能实现下面的效果?

表数据:


实现的效果:
...全文
405 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_31358327 2017-01-16
  • 打赏
  • 举报
回复
我稍微瞄了一眼 感觉只要查询的时候只要加个条件 然后后面加一个排序方式 就可以了
baidu_35289351 2017-01-11
  • 打赏
  • 举报
回复
引用 1 楼 baidu_35289351 的回复:
典型的EXCL数据,同1行有2部分内容,如果要查某个人,都不知道去找那部分。 这种结构,在SQL SERVER中,是不推荐的。
把你表的结构改为: 部门,姓名,性别,到职日期,年龄,职称 合并左右2部分的数据,你的问题就不需要处理了。
baidu_35289351 2017-01-11
  • 打赏
  • 举报
回复
典型的EXCL数据,同1行有2部分内容,如果要查某个人,都不知道去找那部分。 这种结构,在SQL SERVER中,是不推荐的。
baidu_35289351 2017-01-11
  • 打赏
  • 举报
回复
6楼的报表用的结构是标准的SQL表,并不是你1楼EXCL典型的表, 查询结构就是你要的EXCL典型对比报表。
baidu_35289351 2017-01-11
  • 打赏
  • 举报
回复
if object_id('tempdb..#员工表') is not null drop table #员工表 --测试数据: 男女对比 create table #员工表(部门 varchar(20),姓名 varchar(20),性别 varchar(4),到职日期 datetime,年龄 int,职称 varchar(20)) declare @i int,@b varchar(20),@m varchar(20),@x varchar(4),@d datetime,@n int,@q varchar(20) set @i=1 set @d=getdate() set @q='文员' set @x='男' while @i<=21 begin if @i<=10 set @b='板式加工1' else set @b='板式加工2' set @m='张三'+right('000'+rtrim(@i),3) set @d=@d+1 set @n=20+@i if @q='文员' set @q='职员' else set @q='文员' if @x='男' set @x='女' else set @x='男' insert into #员工表 select @b,@m,@x,@d,@n,@q set @i=@i+1 end --测试数据结束 --生成报表开始 declare @左 int,@右 int declare @左表 table(部门 varchar(20),L姓名 varchar(20),L性别 varchar(4),L到职日期 datetime,L年龄 int,L职称 varchar(20),序号 int identity(1,1)) declare @右表 table(部门 varchar(20),R姓名 varchar(20),R性别 varchar(4),R到职日期 datetime,R年龄 int,R职称 varchar(20),序号 int identity(1,1)) select @左=count(1) from #员工表 where 性别='男' select @右=count(1) from #员工表 where 性别='女' insert into @左表 select * from #员工表 where 性别='男' insert into @右表 select * from #员工表 where 性别='女' if @左>@右 select L.部门,L姓名,L性别,L到职日期,L年龄,L职称,R姓名,R性别,R到职日期,R年龄,R职称 from @左表 l left join @右表 r on l.序号=r.序号 else select R.部门,L姓名,L性别,L到职日期,L年龄,L职称,R姓名,R性别,R到职日期,R年龄,R职称 from @右表 r left join @左表 l on l.序号=r.序号
道素 2017-01-11
  • 打赏
  • 举报
回复
一个例子,仅供参考:

 ;WITH tb(dept,sh_name,sh_sex,sh_loc,sh_in_d,sh_age,sh_d,ks_name,ks_sex,ks_loc,ks_in_d,ks_age,ks_d)AS
 (
    SELECT 'abc',NULL,NULL,NULL,NULL,NULL,NULL,'a','f','hb','2016-12-14',39,'n' UNION
    SELECT 'abc',NULL,NULL,NULL,NULL,NULL,NULL,'b','m','hb','2016-12-15',39,'n' UNION
    SELECT 'abc',NULL,NULL,NULL,NULL,NULL,NULL,'c','f','hb','2016-12-16',39,'n' UNION
    SELECT 'abc',NULL,NULL,NULL,NULL,NULL,NULL,'d','m','hb','2016-12-17',39,'n' UNION
    SELECT 'abc',NULL,NULL,NULL,NULL,NULL,NULL,'e','f','hb','2016-12-18',39,'n' UNION
    SELECT 'abc',NULL,NULL,NULL,NULL,NULL,NULL,'f','m','hb','2016-12-19',39,'n' UNION
    SELECT 'abc',NULL,NULL,NULL,NULL,NULL,NULL,'g','f','hb','2016-12-20',39,'n' UNION
    SELECT 'abc','aa','f','ah','2016-07-26',47,'n',NULL,NULL,NULL,NULL,NULL,NULL UNION
    SELECT 'abc','bb','f','ah','2016-07-25',47,'n',NULL,NULL,NULL,NULL,NULL,NULL UNION
    SELECT 'abc','cc','f','ah','2016-07-24',47,'n',NULL,NULL,NULL,NULL,NULL,NULL UNION
    SELECT 'abc','dd','f','ah','2016-07-23',47,'n',NULL,NULL,NULL,NULL,NULL,NULL 
 )
 ,m AS(
    SELECT *,ROW_NUMBER()OVER(PARTITION BY tb.dept ORDER BY sh_name,sh_sex,sh_loc,sh_in_d,sh_age,sh_d) AS sh_rn
         ,ROW_NUMBER()OVER(PARTITION BY tb.dept ORDER BY ks_name,ks_sex,ks_loc,ks_in_d,ks_age,ks_d) AS ks_rn
    FROM tb
 )
 SELECT sh.dept,sh.sh_name,sh.sh_sex,sh.sh_loc,sh.sh_in_d,sh.sh_age,sh.sh_d,ks.ks_name,ks.ks_sex,ks.ks_loc,ks.ks_in_d,ks.ks_age,ks.ks_d
 FROM m  AS sh
 INNER JOIN m AS ks ON sh.dept=ks.dept AND sh.sh_rn=ks.ks_rn
 ORDER BY sh.dept, sh.sh_rn desc

dept	sh_name	sh_sex	sh_loc	sh_in_d	sh_age	sh_d	ks_name	ks_sex	ks_loc	ks_in_d	ks_age	ks_d
abc	dd	f	ah	2016-07-23	47	n	g	f	hb	2016-12-20	39	n
abc	cc	f	ah	2016-07-24	47	n	f	m	hb	2016-12-19	39	n
abc	bb	f	ah	2016-07-25	47	n	e	f	hb	2016-12-18	39	n
abc	aa	f	ah	2016-07-26	47	n	d	m	hb	2016-12-17	39	n
abc	NULL	NULL	NULL	NULL	NULL	NULL	c	f	hb	2016-12-16	39	n
abc	NULL	NULL	NULL	NULL	NULL	NULL	b	m	hb	2016-12-15	39	n
abc	NULL	NULL	NULL	NULL	NULL	NULL	a	f	hb	2016-12-14	39	n
abc	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL
abc	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL
abc	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL
abc	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL
山那頭 2017-01-11
  • 打赏
  • 举报
回复
引用 2 楼 baidu_35289351 的回复:
[quote=引用 1 楼 baidu_35289351 的回复:] 典型的EXCL数据,同1行有2部分内容,如果要查某个人,都不知道去找那部分。 这种结构,在SQL SERVER中,是不推荐的。
把你表的结构改为: 部门,姓名,性别,到职日期,年龄,职称 合并左右2部分的数据,你的问题就不需要处理了。[/quote] 我的表结构是你所说的那样的,就是要形成excel形式对比效果的报表
  • 打赏
  • 举报
回复
直接用insert into table(...)添加啊

34,594

社区成员

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

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