hur.cn - 华软网

 热门搜索

看看这条sql该怎么写

  作者:未知    来源:网络    更新时间:2018/8/6
现有表格式如下:

编号 年分 月份 姓名  部门  任务一 任务二 任务三  当月总计 季度总计 年度总计
1     2005 1    aa     XX   100      200     300
1     2005 1    bb     XX   100      200     300
1     2005 2    aa     XX   100      200     300
1     2005 2    bb     XX   100      200     300
1     2005 3    aa     XX   100      200     300
1     2005 3    bb     XX   100      200     300
1     2005 4    aa     XX   100      200     300
1     2005 4    bb     XX   100      200     300
1     2005 5    aa     XX   100      200     300
1     2005 5    bb     XX   100      200     300
1     2005 6    aa     XX   100      200     300
1     2005 6    bb     XX   100      200     300

已经知道的数据如上,现在要计算 季度总计 年度总计 等2项,请问sql应该怎么写?
另外:这样的格式是否合法?update Atable set colA=(select colA from Btable where btable.colb=btable.colb)
------华软网友回答------

create table tb1
(
Cyear int,
Cmonth int,
Cname varchar(50),
Cdepart varchar(50),
Ctask1 int, 
Ctask2 int,
Ctask3 int
)


insert into tb1

select '2005' ,'1','aa','XX','100','200','300' union all
select '2005' ,'1','bb','XX','100','200','300' union all
select '2005' ,'2','aa','XX','100','200','300' union all
select '2005' ,'2','bb','XX','100','200','300' union all
select '2005' ,'3','aa','XX','100','200','300' union all
select '2005' ,'3','bb','XX','100','200','300' union all
select '2005' ,'4','aa','XX','100','200','300' union all
select '2005' ,'4','bb','XX','100','200','300' union all
select '2005' ,'5','aa','XX','100','200','300' union all
select '2005' ,'5','bb','XX','100','200','300' union all
select '2005' ,'6','aa','XX','100','200','300' union all
select '2005' ,'6','bb','XX','100','200','300' 


--季度统计方法1

select Cyear,convert(varchar,Cyear)+'-'+case when Cmonth between 1 and 3 then '1'
            when Cmonth between 4 and 6 then '2'
            when Cmonth between 7 and 9 then '3'
            when Cmonth between 10 and 12 then '4'
        end +'季度',Cname,Cdepart,sum(Ctask1+Ctask2+Ctask3)
from tb1
group by Cyear,convert(varchar,Cyear)+'-'+case when Cmonth between 1 and 3 then '1'
            when Cmonth between 4 and 6 then '2'
            when Cmonth between 7 and 9 then '3'
            when Cmonth between 10 and 12 then '4'
        end +'季度',Cname,Cdepart


2005 2005-1季度 aa XX 1800
2005 2005-1季度 bb XX 1800
2005 2005-2季度 aa XX 1800
2005 2005-2季度 bb XX 1800


--季度统计方法2

select Cyear,
convert(varchar,Cyear)+'-'+convert(varchar,datepart(quarter,convert(varchar,Cyear)+'-'+convert(varchar,Cmonth)+'-01'))+'季度',
Cname,Cdepart,sum(Ctask1+Ctask2+Ctask3) 
from tb1
group by Cyear,
convert(varchar,Cyear)+'-'+convert(varchar,datepart(quarter,convert(varchar,Cyear)+'-'+convert(varchar,Cmonth)+'-01'))+'季度',
Cname,Cdepart


2005 2005-1季度 aa XX 1800
2005 2005-1季度 bb XX 1800
2005 2005-2季度 aa XX 1800
2005 2005-2季度 bb XX 1800


--年统计

select Cyear,Cname,Cdepart,sum(Ctask1+Ctask2+Ctask3) from tb1
group by Cyear,Cname,Cdepart
order by 3


2005 aa XX 3600
2005 bb XX 3600





drop table tb1


------华软网友回复------
利用数据窗口,分组实现
------华软网友回复------
select 年份, 姓名, 部门 
一季度总计 = (case  when 月份>= 1 and 月份 <= 3 then coalesce(sum(任务一 + 任务二 + 任务三), 0) end)
二季度总计 =  (case  when 月份>= 4 and 月份 <= 6 then coalesce(sum(任务一 + 任务二 + 任务三), 0) end)
三季度总计 = (case  when 月份>= 7 and 月份 <= 9 then coalesce(sum(任务一 + 任务二 + 任务三), 0) end)
四季度总计 = (case  when 月份>= 10 and 月份 <= 12 then coalesce(sum(任务一 + 任务二 + 任务三), 0) end)
年度总计 = coalesce(sum(任务一 + 任务二 + 任务三), 0)
from table
group by 年份, 姓名, 部门 
=============================================================================

update Atable set colA=(select colA from Btable where Btable.colb=Atable.colb)
=============================================================================
你要保证 set 后面的值不是一个数据集, 而只是一个值!
------华软网友回复------
分组求和
------华软网友回复------
谢谢兄弟门了,这两天去施工了,我回去实一下!
------华软网友回复------
不行啊,我实了一下!我用的是pb9+access
------华软网友回复------
我用计算的季度累计是:如果是这个季度的第一个月,季度累计=这个月数据
第二个月=第一个月+第二哥月.....年度累计是从1月到当前月的记录!我现在能用select选择出季度累计,但是当用在update table set jdlj=(select.....)中的时候,老是出错,提示什么必须是一个可更新的查询
------华软网友回复------
楼主是否只需要显示,而不需要保存数据?

想实现这种效果最好用DW来做,肯定省事,写几个computer field就行了,用CumulativeSum,sum就可以解决,具体看帮助

2.update table set jdlj=(select.....) 写这句SQL想干什么? 想所整个表的jdlj列的值改成另一个select出来的值??? 请注意是整个表!   如果你的(select ...)部分只返回一个值的话,语句就可以成功执行!
------华软网友回复------
to  lzheng2001(1加1):是啊,我想要的是保存数据,刚开始的时候一条一条的读,在程序中计算后然后去update,效率太差了 ,现在改成了聚合函数和临时表的形式,数据快多了!
.update table set jdlj=(select.....) 这句主要是想利用另外一个表的一个字段去更新这个表,我用的是access,用上面的语句一直报错,最后别人告诉我update table1,table2 set table1.cola=table2.colb where...这样的形式才解决!
现在还有个小问题:update zgjfb set 
sfjj=iif(byzjf+jdsy<=0,0,iif(byzjf+jdsy>ksyrws,yfjj,(yfjj*(byzjf+jdsy)/ksyrws)));这句报错!

------华软网友回复------
报什么错? 


------华软网友回复------
晕死,好像是我写错列名了,正在检查!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。