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
- sql server如何求前N列的和(具体几列未知) 右侧汇总
- 用递归求数列的前n列的和
- 目前sql语法尚不支持的多列(元组)in的替换实现、分组取前n名
- SQL Server 如何重新恢复自动编号列的序号
- SQL Server 如何重新恢复自动编号列的序号
- SQL Server 如何重新恢复自动编号列的序号
- 如何把 SQL Server 的自增标志列清零
- 如何把 SQL Server 的自增标志列清零
- SQL Server 如何重新恢复自动编号列的序号
- Sql Server 中如何删除列的identity属性
- SQL Server 如何重新恢复自动编号列的序号
- [转]:如何让PowerDesigner支持自动生成含SQL Server 2000的表和列注释
- [转]:如何让PowerDesigner支持自动生成含SQL Server 2000的表和列注释
- SQL Server 如何使用命令修改表名或表的列名 和 删除表
- SQL Server 2008中的稀疏列和列集
- SQL Server 2008中的稀疏列和列集
- sql server 和 oracle查询列名以及列数
- PowerDesigner 获取sql server 2000 列和表的注释
- 刺杀大使{未完成}
- oracle 恢复误删除的表和误更新的表
- AsyncTask,Handler,Looper,MessageQueue
- 深入浅出MFC笔记3-MFC程序的消息流转
- 【cocos2d-x】 之 模态对话框
- sql server如何求前N列的和(具体几列未知) 右侧汇总
- MFC在VS2008中为ActiveX控件添加属性 .
- Eclipse环境开发java:Selection does not contain a main type
- 终于搞定android驱动USB摄像头了!
- linux下消息队列小例子
- ServletMapping的处理
- 获取上一页面的URL和本页的URL
- MFC在VS2008中开发ActiveX控件,运行时自带的容器在哪? .
- 搭建XMPP协议,实现自主推送消息到手机