貌似你的这个SQL分组统计只跟第二张表有关系,跟另外两张表都没有关系。
假设第二张表T的字段为(id,name,sex,deptno,sal)
检索每个部门不同性别的平均工资,每个部门的平均工资,公司所有员工的平均工资,所有男性的平均工资,和所有女性的平均工资。
select
sum(decode(sex,'男',sal,'女',0))/
sum(decode(sex,'男',1,'女',0))
全男均薪e799bee5baa6e997aee7ad94e4b893e5b19e31333236393131,
sum(decode(sex,'男',0,'女',sal))/
sum(decode(sex,'男',0,'女',1))
全女均薪,
sum(decode(sex,'男',decode(deptno,1,sal,0),'女',0))/
sum(decode(sex,'男',decode(deptno,1,1,0),'女',0))
一男均薪,
sum(decode(sex,'男',decode(deptno,2,sal,0),'女',0))/
sum(decode(sex,'男',decode(deptno,2,1,0),'女',0))
二男均薪,
sum(decode(sex,'男',decode(deptno,3,sal,0),'女',0))/
sum(decode(sex,'男',decode(deptno,3,1,0),'女',0))
三男均薪,
sum(decode(sex,'男',decode(deptno,4,sal,0),'女',0))/
sum(decode(sex,'男',decode(deptno,4,1,0),'女',0))
四男均薪,
sum(decode(sex,'女',decode(deptno,1,sal,0),'男',0))/
sum(decode(sex,'女',decode(deptno,1,1,0),'男',0))
一女均薪,
sum(decode(sex,'女',decode(deptno,2,sal,0),'男',0))/
sum(decode(sex,'女',decode(deptno,2,1,0),'男',0))
二女均薪,
sum(decode(sex,'女',decode(deptno,3,sal,0),'男',0))/
sum(decode(sex,'女',decode(deptno,3,1,0),'男',0))
三女均薪,
sum(decode(sex,'女',decode(deptno,4,sal,0),'男',0))/
sum(decode(sex,'女',decode(deptno,4,1,0),'男',0))
四女均薪,
sum(decode(deptno,1,sal,0))/sum(decode(deptno,1,1,0))
一部均薪,
sum(decode(deptno,2,sal,0))/sum(decode(deptno,2,1,0))
二部均薪,
sum(decode(deptno,3,sal,0))/sum(decode(deptno,3,1,0))
三部均薪,
sum(decode(deptno,4,sal,0))/sum(decode(deptno,4,1,0))
四部均薪,
sum(sal)/count(sal)
人均薪,
sum(sal)
全薪
from
T
/
也可以改为CASE
WHEN
THEN
WHEN
THEN
ELSE
END的语法这个是SQL标准语法,DECODE是ORACLE独特语法。
纯粹就是考察CASE的用法嘛~
方法和详细的操作步骤如下:
1、第一步,创建一个测试表,详细代码见下图,转到下面的步骤。
2、第二步,执行完上面的操作之后,插入测试数据,详细代码见下图,转到下面的步骤。
3、第三步,执行完上面的操作之后,在查询表中进行记录,纤细代码见下图,转到下面的步骤。
4、第四步,执行完上面的操作之后,编写sql,对记录进行分组统计,记录分组数,其结果是4组,见下图。这样,就解决了这个问题了。
--sql
server
2000
动态sql。
declare
@sql
varchar(8000)
set
@sql
=
'select
姓名
'
select
@sql
=
@sql
+
'
,
max(case
课程
when
'''
+
课程
+
'''
then
分数
els订唬斥舅俪矫筹蝎船莽e
0
end)
['
+
课程
+
']'
from
(select
distinct
课程
from
tb)
as
a
set
@sql
=
@sql
+
'
,
cast(avg(分数*1.0)
as
decimal(18,2))
平均分
,
sum(分数)
总分
from
tb
group
by
姓名'
exec(@sql)
普通行列转换
问题:假设有张学生成绩表(tb)如下:
姓名
课程
分数
张三
语文
74
张三
数学
83
张三
物理
93
李四
语文
74
李四
数学
84
李四
物理
94
想变成(得到如下结果):
姓名
语文
数学
物理
----
----
----
----
李四
74
84
94
张三
74
83
93
-------------------
*/
create
table
tb(姓名
varchar(10)
,
课程
varchar(10)
,
分数
int)
insert
into
tb
values('张三'
,
'语文'
,
74)
insert
into
tb
values('张三'
,
'数学'
,
83)
insert
into
tb
values('张三'
,
'物理'
,
93)
insert
into
tb
values('李四'
,
'语文'
,
74)
insert
into
tb
values('李四'
,
'数学'
,
84)
insert
into
tb
values('李四'
,
'物理'
,
94)
go
--sql
server
2000
静态sql,指课程只有语文、数学、物理这三门课程。(以下同)
select
姓名
as
姓名
,
max(case
课程
when
'语文'
then
分数
else
0
end)
语文,
max(case
课程
when
'数学'
then
分数
else
0
end)
数学,
max(case
课程
when
'物理'
then
分数
else
0
end)
物理
from
tb
group
by
姓名
select sum(t.t_a), sum(t.t_b), sum(t.t_c), t.sno
from (select count(type) t_a, 0 t_b, 0 t_c, sno
from a
where type = 'a'
group by sno, type
union all
select 0 t_a, count(type) t_b, 0 t_c, sno
from a
where type = 'b'
group by sno, type
union all
select 0 t_a, 0 t_b, count(type) t_c, sno
from a
where type = 'c'
group by sno, type) t
group by t.sno
order by t.sno
select sno,type ,count(type)from table group by sno,type
这是竖的,横的下面
select sno,sum(case when type='a' then 1 else 0 end) as t_a,sum(case when type='b' then 1 else 0 end) as t_b,sum(case when type='c' then 1 else 0 end) as t_c from table group by sno