求一条SQL语句。如下

redpillzzp 2010-05-28 09:36:13
求一条SQL语句。如下
表 a
id 主键
部门 id
员工姓名
学历

表 b
id 主键
部门名

表 c
学历 id
学历名

求表
部门a 部门b 部门c 部门d
初中 x x x x
高中 x x x x
大专 x x x x
大学 x x x x

统计 人数
...全文
191 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmcode 2010-05-28
  • 打赏
  • 举报
回复
--create table
create table ##a
(
aid int identity(1,1) primary key,
bid int,
uname varchar(50),
cid int
)

create table ##b
(
bid int identity(1,1) primary key,
bname varchar(50)
)

create table ##c
(
cid int identity(1,1) primary key,
cname varchar(50)
)

--insert into
insert into ##b(bname) values('部门a')
insert into ##b(bname) values('部门b')
insert into ##b(bname) values('部门c')
insert into ##b(bname) values('部门d')

insert into ##c(cname) values('初中')
insert into ##c(cname) values('高中')
insert into ##c(cname) values('大专')
insert into ##c(cname) values('大学')

insert into ##a(bid,uname,cid) values(1,'u1',1)
insert into ##a(bid,uname,cid) values(2,'u2',2)
insert into ##a(bid,uname,cid) values(3,'u3',3)
insert into ##a(bid,uname,cid) values(4,'u4',4)
insert into ##a(bid,uname,cid) values(1,'u5',4)
insert into ##a(bid,uname,cid) values(2,'u6',4)
insert into ##a(bid,uname,cid) values(3,'u7',4)
insert into ##a(bid,uname,cid) values(4,'u8',4)

--select
select cid,bid,count(1) 'num' into ##d from ##a group by cid,bid order by cid,bid
declare @sql varchar(8000)
set @sql = 'select cid [学历]'
select @sql = @sql + ' , max(case bid when ''' + convert(varchar,bid) + ''' then num else 0 end) [部门' + convert(varchar,bid) + ']'
from (select distinct bid from ##d) as a
set @sql = @sql + ' from ##d group by cid'
exec(@sql)


查询部分可放存储过程中执行,查询结果:

学历 部门1 部门2 部门3 部门4
----------- ----------- ----------- ----------- -----------
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 1 1 1 2
cyljay 2010-05-28
  • 打赏
  • 举报
回复
如果要满足动态的话,可以用游标尝试一下。。。。
redpillzzp 2010-05-28
  • 打赏
  • 举报
回复
动态SQL,如何写?
修改一下昵称 2010-05-28
  • 打赏
  • 举报
回复
那就用动态sql

sunbaoliang 2010-05-28
  • 打赏
  • 举报
回复
员工姓名 如果是必填的 那为什么 不直接查一下 员工姓名的条数呢
redpillzzp 2010-05-28
  • 打赏
  • 举报
回复
这样写的话,如果我的数据库的学历或是部门发生改变的时候,不是还是修改这个SQL语句吗?
wmcode 2010-05-28
  • 打赏
  • 举报
回复
上边的有些问题,修改了下:

--create table
create table #a
(
aid int identity(1,1) primary key,
bid int,
uname varchar(50),
cid int
)

create table #b
(
bid int identity(1,1) primary key,
bname varchar(50)
)

create table #c
(
cid int identity(1,1) primary key,
cname varchar(50)
)

--insert into
insert into #b(bname) values('部门a')
insert into #b(bname) values('部门b')
insert into #b(bname) values('部门c')
insert into #b(bname) values('部门d')

insert into #c(cname) values('初中')
insert into #c(cname) values('高中')
insert into #c(cname) values('大专')
insert into #c(cname) values('大学')

insert into #a(bid,uname,cid) values(1,'u1',1)
insert into #a(bid,uname,cid) values(2,'u2',2)
insert into #a(bid,uname,cid) values(3,'u3',3)
insert into #a(bid,uname,cid) values(4,'u4',4)
insert into #a(bid,uname,cid) values(1,'u5',4)
insert into #a(bid,uname,cid) values(2,'u6',4)
insert into #a(bid,uname,cid) values(3,'u7',4)
insert into #a(bid,uname,cid) values(4,'u8',4)
--select
select
case cid when 1 then '初中' when 2 then '高中' when 3 then '大专' when 4 then '大学' end '学历',
sum(case bid when 1 then 1 else 0 end) '部门a',
sum(case bid when 2 then 1 else 0 end) '部门b',
sum(case bid when 3 then 1 else 0 end) '部门c',
sum(case bid when 4 then 1 else 0 end) '部门d'
from #a group by cid order by cid


查询结果:

学历 部门a 部门b 部门c 部门d
---- ----------- ----------- ----------- -----------
初中 1 0 0 0
高中 0 1 0 0
大专 0 0 1 0
大学 1 1 1 2
redpillzzp 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wmcode 的回复:]
SQL code
--create table
create table #a
(
aid int identity(1,1) primary key,
bid int,
uname varchar(50),
cid int
)

create table #b
(
bid int identity(1,1) primary key,……
[/Quote]

但表名的列数是不确定的,因为部门的数量和名称是动态的,这如何实现?
yht8572 2010-05-28
  • 打赏
  • 举报
回复
ewarewat
redpillzzp 2010-05-28
  • 打赏
  • 举报
回复
学历和部门的字段是动态的,不是有明确定数量的
redpillzzp 2010-05-28
  • 打赏
  • 举报
回复
兄弟给条语句,我研究一下啊。
wmcode 2010-05-28
  • 打赏
  • 举报
回复
--create table
create table #a
(
aid int identity(1,1) primary key,
bid int,
uname varchar(50),
cid int
)

create table #b
(
bid int identity(1,1) primary key,
bname varchar(50)
)

create table #c
(
cid int identity(1,1) primary key,
cname varchar(50)
)

--insert into
insert into #b(bname) values('b1')
insert into #b(bname) values('b2')
insert into #b(bname) values('b3')
insert into #b(bname) values('b4')

insert into #c(cname) values('部门a')
insert into #c(cname) values('部门b')
insert into #c(cname) values('部门c')
insert into #c(cname) values('部门d')

insert into #a(bid,uname,cid) values(1,'初中',1)
insert into #a(bid,uname,cid) values(2,'高中',2)
insert into #a(bid,uname,cid) values(3,'大专',3)
insert into #a(bid,uname,cid) values(4,'大学',4)
insert into #a(bid,uname,cid) values(1,'大学',4)
insert into #a(bid,uname,cid) values(2,'大学',4)
insert into #a(bid,uname,cid) values(3,'大学',4)
insert into #a(bid,uname,cid) values(4,'大学',4)
--select
select
cid '学历',
sum(case bid when 1 then 1 else 0 end) '部门a',
sum(case bid when 2 then 1 else 0 end) '部门b',
sum(case bid when 3 then 1 else 0 end) '部门c',
sum(case bid when 4 then 1 else 0 end) '部门d'
from #a group by cid order by cid


学历 部门a 部门b 部门c 部门d
----------- ----------- ----------- ----------- -----------
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 1 1 1 2

(4 行受影响)
qldsrx 2010-05-28
  • 打赏
  • 举报
回复
什么数据库?这不是典型的透视表问题吗?一般常规方法使用case when语句来产生计算列。
redpillzzp 2010-05-28
  • 打赏
  • 举报
回复
不行啊。兄弟
sprc_lcl 2010-05-28
  • 打赏
  • 举报
回复
select b.*,c.*,(select count(0) from a where 部门Id=b.id and 学历id=c.id) as count from b,c

先执行看看吧
redpillzzp 2010-05-28
  • 打赏
  • 举报
回复
x代表人数
hhc123 2010-05-28
  • 打赏
  • 举报
回复
x x x x
是代表人数吧。
ztaimm 2010-05-28
  • 打赏
  • 举报
回复
帮顶~~

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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