日期:2014-05-17  浏览次数:20499 次

请教纵向和横向求和的问题
现有一表A
id 姓名 考核年度 岗位履职 对口考核 *宣传发表 *调研发表 *信息发表 *每日一题 *其他 
1 张三 2012 10 0 0 0 0 0 0
2 李四 2012 0 0 10 0 0 0 0
3 张三 2011 10 0 0 0 0 0 0
4 张三 2010 0 0 0 0 0 5 0
5 李四 2011 0 0 10 0 0 0 0
6 张三 2012 0 10 0 0 0 0 0
(注)带星号的为动态列,可从程序随意添加和删除的列

想实现以下结果

id 姓名 考核年度 岗位履职 对口考核 加减分 总分
1 张三 2012 10 10 0 20
2 张三 2011 10 0 10 15
3 张三 2010 0 0 5 5

表A带星号的列 求和后 as 加减分,结果中的总分 就是行数值总和 

也就是想要 2012年度 岗位、对口、加减分的纵向和 还有结果中每行的横向和

------解决方案--------------------
select t.year,t.j1,j2,j3,(j1+j2+j3)as total (SELECT a.year,SUM(a.岗位履职) AS j1,SUM(a.对口考核) AS j2,SUM(a.宣传发表)AS j3 FROM A a
WHERE a.name='张三'
GROUP BY a.[year])t
至于动态的,建议穿参数进去
------解决方案--------------------
探讨
问题是带星号的列名是动态的 我可以任意删除和增加的

------解决方案--------------------
try this,
SQL code


ALTER PROC [dbo].[up_JXhuizong]
(@JXtime varchar(50),
 @sql8 varchar(50))
as
declare @str varchar(2000)
set @str=''
select @str=@str+',sum('+name+') as '+name
from syscolumns 
where id=object_id('JXhuizong')
and name not in('id','JXtime','姓名','UnitName','岗位履职','JXniandu')  

declare @col varchar(2000)
set @col=''
select @col=@col+'+'+name
from syscolumns 
where id=object_id('JXhuizong')
and name not in('id','JXtime','姓名','UnitName','岗位履职','JXniandu')  

print @col

set @str='select row_number()over(order by getdate()) as id,UnitName as 部门,姓名,岗位履职'
+@str+',(select '+RIGHT(@col,LEN(@col)-1)
+' from JXhuizong b where a.姓名=b.姓名 and JXtime='''+@JXtime+''')as 加减总分  
from JXhuizong a where JXtime='''+@JXtime+''' group by UnitName,姓名,岗位履职 '+@sql8+''

exec(@str)

------解决方案--------------------
所有动态列的和相加的结果AS 加减分

动态列1 动态列2 动态列3 。。。。。。
1 2 3
1 2 3

(sum(动态列1)+sum(动态列2)+sum(动态列3)) as 加减分
------解决方案--------------------
SQL code

SELECT id,姓名,考核年度,岗位履职,对口考核,
*宣传发表,*调研发表,*信息发表,*每日一题,*其他,SUM(TOTAL)  
FROM T 
(
SELECT id,姓名,考核年度,SUM(岗位履职) AS 岗位履职,SUM(对口考核) AS 对口考核,
SUM(*宣传发表) AS '*宣传发表',SUM(*调研发表) AS '*调研发表',
SUM(*信息发表) AS '*信息发表',SUM(*每日一题) AS '*每日一题',SUM(*其他) AS '*其他',
(岗位履职+对口考核+*宣传发表+*调研发表+*信息发表+*每日一题+*其他) AS TOTAL 
FROM A 
GROUP BY ID,姓名,考核年度) T 
GROUP BY id,姓名,考核年度,岗位履职,对口考核,
*宣传发表,*调研发表,*信息发表,*每日一题,*其他