sql server如何求前N列的和(具体几列未知) 右侧汇总

来源:互联网 发布:ddos攻击某个端口 编辑:程序博客网 时间:2024/05/23 17:07

sql server如何求前N列的和(具体几列未知) 右侧汇总

首先创建数据,以小区收费为例:

select identity(int,1,1) as ID,tb.* into #Test from(Select 100 as 电费,20  as 水费, 25 as 物业费,180 as 租金union allSelect 90  as 电费,120 as 水费,125 as 物业费,10 as 租金union allSelect 10  as 电费,210 as 水费,225 as 物业费,100 as 租金) tb

ID          电费          水费          物业费         租金
----------- ----------- ----------- ----------- -----------
1           100         20          25          180
2           90          120         125         10
3           10          210         225         100


① 若已知具体费用名称可以通过下面的方法实现:

Select *,电费+水费+物业费+租金 as 总费用 from #Test

ID          电费          水费          物业费         租金          总费用
----------- ----------- ----------- ----------- ----------- -----------
1           100         20          25          180         325
2           90          120         125         10          345
3           10          210         225         100         545


② 但若费用名称是未知的,却想要求出总费用,可以参考如下的方法:


因为基本信息已保存在表内,可以利用系统表查看表中的字段

select [name],[column_id] from tempdb.sys.columns where [object_id]=object_id('tempdb.dbo.#Test')

name                    column_id
---------             -----------
ID                           1
电费                         2
水费                         3
物业费                       4
租金                         5


然后要做的就是想办法把信息取出来, 于是想到利用 for xml path(''),而且需要把ID列取消:

select [name] from tempdb.sys.columns where [object_id]=object_id('tempdb.dbo.#Test') AND column_id<>1  for xml path('')

但结果却是这样的,这并不是我们想要的结果:

XML_F52E2B61-18A1-11d1-B105-00805F49916B
----------------------------------------------------------------------
<name>电费</name><name>水费</name><name>物业费</name><name>租金</name>

我们需要的是这样的形式:  电费+水费+物业费+租金
于是想到用REPLACE() 和STUFF(),具体语法可以参考联机丛书

declare @iname xmldeclare @sumname nvarchar(100)declare @sql nvarchar(max)select @iname=(select [name] from tempdb.sys.columns where [object_id]=object_id('tempdb.dbo.#Test') AND column_id<>1 for xml path(''))select @sumname=stuff(replace(replace(cast(@iname as nvarchar(100)),'</name>',''),'<name>','+'),1,1,'')set @sql='select *, '+ @sumname+' As 总费用  from #Test'exec (@sql)


ID          电费          水费          物业费         租金          总费用
----------- ----------- ----------- ----------- ----------- -----------
1           100         20          25          180         325
2           90          120         125         10          345
3           10          210         225         100         545

 搞定!




顺便写一下判断润年的方法:
①判断本年的二月最后一天是不是28天
select  case  day(dateadd(ms,-3,dateadd(month,2,dateadd(year,datediff(year,0,getdate()),0))))
when 28 then '平年' else '润年' end


②判断年份的整除关系
select  case when  (year(getdate())%4=0 and year(getdate())%100<>0) or year(getdate())%400=0
then '闰年' else 'bushi' end


原创粉丝点击