创建动态视图

http://www.cbf107.com/CBF107Item.aspx?ID=79c98c3e-aea2-46f9-baa7-1ccd067e2a81

SQLServer2005 Pivot 转置使用动态列(应用到视图)

SQLServer2005 Pivot 转置使用动态列(应用到视图)

最近项目中用到Pivot 对表进行转置,遇到一些问题,主要是Pivot 转置的时候没有办法动态产生转置列名,而作视图的时候又很需要动态的产生这些列,百度上似乎也没有找的很满意的答案,在google上搜到一老外的解决方案,现在自己总结了一下,希望给用的上的朋友一些帮助。

1.创建表脚本

if exists (select 1

from  sysobjects

where  id = object_id(‘Insurances‘)

and   type = ‘U‘)

drop table Insurances

go

/*==============================================================*/

/* Table: Insurances                                            */

/*==============================================================*/

create table Insurances (

RefID                uniqueidentifier     not null,

HRMS                 nvarchar(20)         null,

Name                 nvarchar(20)         null,

InsuranceMoney       money                null,

InsuranceName        nvarchar(100)        not null,

constraint PK_INSURANCES primary key (RefID)

)

go

2.测试数据脚本

insert into Insurances values (newid(),1,‘张三‘,200,‘养老保险‘)

insert into Insurances values (newid(),1,‘张三‘,300,‘医疗保险‘)

insert into Insurances values (newid(),2,‘李四‘,250,‘养老保险‘)

insert into Insurances values (newid(),2,‘李四‘,350,‘医疗保险‘)

insert into Insurances values (newid(),3,‘王二‘,150,‘养老保险‘)

insert into Insurances values (newid(),3,‘王二‘,300,‘医疗保险‘)

3.查询表数据

select HRMS,Name,InsuranceMoney,InsuranceName From Insurances

HRMS                 Name                 InsuranceMoney        InsuranceName

-------------------- -------------------- --------------------- ----------

1                    张三                  200.00                养老保险

2                    李四                  350.00                医疗保险

2                    李四                  250.00                养老保险

1                    张三                  300.00                医疗保险

3                    王二                  300.00                医疗保险

3                    王二                  150.00                养老保险

4.转置表数据

select * from

(

select HRMS,Name,InsuranceMoney,InsuranceName from Insurances

) p

Pivot (

sum(InsuranceMoney)

FOR InsuranceName IN

( [医疗保险], [养老保险]))

as pvt

HRMS                 Name                 医疗保险                 养老保险

-------------------- -------------------- --------------------- ---------------------

2                    李四                  350.00                250.00

3                    王二                  300.00                150.00

1                    张三                  300.00                200.00

5.偶的问题

这个语句中 医疗保险、养老保险 是SQL语句中写死的,而且Sql2005中这个代码没有办法使用动态的查询结果集

5.存储过程解决问题

所以如果要动态的完成个脚本,可以先拼出SQL 然后通过exec sp_executesql 执行

实现存储过程

create procedure InsurancePivot

as

Begin

DECLARE @ColumnNames VARCHAR(3000)

SET @ColumnNames=‘‘

SELECT

@ColumnNames = @ColumnNames + ‘[‘ + InsuranceName + ‘],‘

FROM

(

SELECT DISTINCT InsuranceName FROM Insurances

) t

SET @ColumnNames= LEFT(@ColumnNames, LEN(@ColumnNames)-1)

DECLARE @selectSQL NVARCHAR(3000)

SET @selectSQL=

‘SELECT HRMS,Name,{0} FROM

(

SELECT HRMS,Name,InsuranceMoney,InsuranceName FROM Insurances

) p

Pivot( Max(InsuranceMoney)  For InsuranceName in ({0})) AS pvt

ORDER BY HRMS‘

SET @selectSQL= REPLACE(@selectSQL,‘{0}‘,@ColumnNames)

exec sp_executesql @selectSQL

end

测试存储过程:

exec InsurancePivot

HRMS                 Name                 养老保险                 医疗保险

-------------------- -------------------- --------------------- ---------------------

1                    张三                  200.00                300.00

2                    李四                  250.00                350.00

3                    王二                  150.00                300.00

6.关于视图的新问题和解决方案

在视图中没有办法直接调用这个存储过程,但是我们在做程序、做报表的时候又非常需要

其实可以通过OPENQUERY来实现(这是一个非正规的解决方式,但目前可以实现)

(另外可以使用OPENROWSET,但是参数太多偶放弃了)

使用OPENQUERY 的格式是:OPENQUERY([链接服务器],’sql语句’)

因为是当前数据的视图, 链接服务器可以通过属性查看,MSCBF107 是我测试的链接服务器

也可以通过sp_helpserver 查看

下面这句话也非常重要,使用的朋友替换[MSCBF107]就ok了,否则使用OPENQUERY会出现未将服务器‘MSCBF107‘ 配置为用于DATA ACCESS

sp_serveroption [MSCBF107], ‘Data Access‘, ‘True‘

创建视图如下:

create view InsurancePivotView

as

select *From OPENQUERY ([MSCBF107],N‘SET FMTONLY OFF;exec test.dbo.InsurancePivot‘)

测试视图就可以得到想要的结果了

select *from InsurancePivotView

That’s all

时间: 2024-11-05 18:57:05

创建动态视图的相关文章

openerp创建动态视图-fields_view_get

openerp的视图结构是以XML的格式存放于ir.ui.view表中,属于静态格式,设计之后就固定, 但可以通过在model中重写fields_view_get函数,在视图加载时修改arch属性,动态修改视图的结构 def fields_view_get(self, cr, uid, view_id=None,view_type='form',context=None,toolbar=False,submenu=False): ip_obj = self.pool.get('hr.rule.i

【ASP.NET Web API教程】2.3.5 用Knockout.js创建动态UI

注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 5: Creating a Dynamic UI with Knockout.js 第5部分:用Knockout.js创建动态UI 本文引自:http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-framework/using-web-api-with-entity-fra

Oracle 参数文件、v$parameter动态视图、OMF特性、启动

PFILE与SPFILE 1.  含义:PFILE是parameterfile的缩写,SPFILE是server parameter file的缩写,通过全称的字面含义,我们可以得到pfile和spfile都是oracle提供的参数文件,里面写着各种参数的初始值,比如Database Buffer的值为196M等,文件后缀名都是.ora: 2.  区别:spfile是oracle9i release2引进的新事物,在这之前oracle中只有pfile的概念.Pfile是一种静态参数文件,可以通过

Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步

摘自:http://blog.csdn.net/javaee_sunny/article/details/53439980 目录(?)[-] Oracle 10g 物化视图语法如下 实例演示 主要步骤 在A节点创建原表和物化视图日志 在B节点创建连接A节点的远程链接 在B节点处创建目标表和与目标表名称相同的物化视图 在B节点处刷新物化视图 升级采用存储过程定时任务JOB方式定时刷新物化视图 进一步优化 文章更新记录 参考文章 Oracle 10g 物化视图语法如下: create materia

创建界面视图的流程

1,创建主窗体 在内存中实例化JFrame对象 通过使用setSize(),setBounds()或者pack()方法给JFrame设置大小 通过使用setTitle()设置标题,setDefaultCloseOperation()设置关闭策略,setLocationRelativeTo()设置主窗体的位置 通过使用setVisible(true)设置组件对象可见 2,设置布局管理器 通过setLayout()设置布局管理器 通过add()语句添加各种组件到布局管理器中 创建界面视图的流程,布布

oracle动态视图v$,v_$,gv$,gv_$与x$之间的关系

前言:在oracle运维的过程中,经常会使用到一些以V$开头的动态视图,比如V$session, 有一次偶然看到有人用V_$session, 初以为别人写错了,没想到desc v_$session以后能看到和v$session一样的结构,再以后又发现以gv$开头的视图等等.趁这次在一台Linux系统上装oracle的机会,终于弄清楚了这些动态视图与相应表之间的关系.这些都是由oracle自己管理的数据结构,得从v$fixed_table入手:[[email protected] admin]$

cxf 创建动态webService

D:\developTools\apache-cxf-2.5.2\samples\wsdl_first_dynamic_client CXF 方法 cxf方法 serviceInfo.getBindings() BindingInfo--[BindingInfo http://schemas.xmlsoap.org/wsdl/soap/] serviceInfo.getDocumentation() WS_0917_05 package com.test; import java.beans.P

Cocos2d-X 使用CCTableView创建滚动视图

CCTableView和CCScrollView一样用于创建滚动视图,CCTableView的功能也比较多,创建比较麻烦 实例1:使用CCTableView创建滚动视图 首先创建一个TableView类 TableView.h中的代码 #ifndef __TableView_H__ #define __TableView_H__ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_

创建物化视图详解(图解)

创建物化视图详解 一,什么是物化视图 物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照. 二,作用. 在类似统计功能中,查询操作是无可避免,而这些查询操作如果很频繁,对整体数据库性能是很致命的.而物化视图实现远程数据源与本地数据的实时同步,也就是定时刷新,通过在本地创建物化视图可以大大提高查询效率. 三,流程图: 当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库