sql 分类汇总查询语句

比如:iddeptpayzt———————————–1办公室20.00012局领导10.00023办公室40.00034局领导10.00015办公室50.00016局领导... 比如:

id dept pay zt
———————————–
1 办公室 20.00 01
2 局领导 10.00 02
3 办公室 40.00 03
4 局领导 10.00 01
5 办公室 50.00 01
6 局领导 10.00 02
7 办公室 20.00 02
8 局领导 10.00 02
……
我现在想统计01、02两种状态的数量和pay合计。所有状态的数量
显示显示效果如下:
序号 部门 合计 个数(01状态) 个数(02状态) 总数
————————————————————————————————
1 办公室 90.00 2 1 4
2 局领导 50.00 1 3 4
展开
 我来答
醉含笑
推荐于2017-09-16 · TA获得超过126个赞
知道答主
回答量:108
采纳率:0%
帮助的人:71万
展开全部
select min(id) as 序号,
max(dept) as 部门,
sum(pay) as 合计,
sum(case zt when '01' then 1 else 0 end) as 个数01状态,
sum(case zt when '02' then 1 else 0 end) as 个数02状态,
count(zt) as 总数
from 表名
group by dept

这段代码是sqlserver和oracel通用,其中“表名”的地方,换成你的表名

喔看掉了这个条件:我现在想统计01、02两种状态的数量和pay合计

还是 zjwssg提醒,但最后两个sum中when后面,建议还是加单引号吧

把上面的代码改为这样应该没问题了
select min(id) as 序号,
max(dept) as 部门,
sum(case when zt='01' OR zt='02' then pay else 0 end) as 合计,
sum(case zt when '01' then 1 else 0 end) as 个数01状态,
sum(case zt when '02' then 1 else 0 end) as 个数02状态,
count(zt) as 总数
from 表名
group by dept
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
zjwssg
2009-08-21 · TA获得超过1232个赞
知道答主
回答量:441
采纳率:0%
帮助的人:243万
展开全部
醉含笑的很牛,不过SUM(pay)有点需要改动

最终完美版:
select min(id) as 序号,
max(dept) as 部门,
sum(case when zt='01' OR zt='02' then pay else 0 end) as 合计,
sum(case zt when 01 then 1 else 0 end) as 个数01状态,
sum(case zt when 02 then 1 else 0 end) as 个数02状态,
count(zt) as 总数
from aac
group by dept
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
如意又婉丽的雪花N
2009-08-21 · TA获得超过1213个赞
知道小有建树答主
回答量:630
采纳率:0%
帮助的人:1022万
展开全部
select
ROW_NUMBER() over(order by a.dept) 序号,
a.dept 部门,
a.合计,
b.个数01,
c.个数02,
d.总数
from

(select dept,SUM(pay) 合计 from t where zt='01' or zt='02' group by dept) a,
(select dept,COUNT(pay) 个数01 from t where zt='01' group by dept) b,
(select dept,COUNT(pay) 个数02 from t where zt='02' group by dept) c,
(select dept,COUNT(pay) 总数 from t group by dept) d
where a.dept=b.dept and b.dept=c.dept and c.dept=d.dept

参照楼上的写法,改进一下有:
select
ROW_NUMBER() over(order by dept) 序号,
dept as 部门,
sum(case when zt='01' OR zt='02' then pay else 0 end) 合计,
sum(case when zt='01' then 1 else 0 end) as 个数01状态,
sum(case when zt='02' then 1 else 0 end) as 个数02状态,
count(*) as 总数
from t
group by dept
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
世界大同喵
2009-08-21 · TA获得超过288个赞
知道答主
回答量:37
采纳率:100%
帮助的人:15.2万
展开全部
create table tb (id int,dept varchar(10),pay int,zt int)
insert tb select 1,'办公室',20,1
union all select 2,'局领导',10,2
union all select 3,'办公室',40,3
union all select 4,'局领导',10,1
union all select 5,'办公室',50,1
union all select 6,'局领导',10,2
union all select 7,'办公室',20,2
union all select 8,'局领导',10,2

select identity(int,1,1) as 序号,
dept as 部门,
sum(case when zt='01' OR zt='02' then pay else 0 end) 合计,
sum(case when zt='1' then 1 else 0 end) 个数01状态,
sum(case when zt='2' then 1 else 0 end) 个数02状态,
count(*) as 总数 into #temp from tb group by dept

select * from #temp
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
midasblesshj
2009-08-21 · TA获得超过127个赞
知道小有建树答主
回答量:177
采纳率:0%
帮助的人:179万
展开全部
如果你用的是sql server可以:
select 序号=identity(int,1,1),dept as 部门,sun(pay) as 合计,sum(case when zt='01' then 1 else 0 end) as 个数01状态,sum(case when zt='02' then 1 else 0 end) as 个数02状态,count(*) as 总数 into #tmp_total from yourtablename group by dept

select * from #tmp_total 就得到你要的效果了

你要说是在什么数据库下,数据库不同写法也是有一定差别的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式