巧用SQL PIVOT实现环境监测数据的“竖横”转换
水环境监测数据存储结构中有一种模式叫做"竖表模式",即在监测数据表中,某个点位在某个时间点上各监测项目的浓度测定值在物理表中存储在多条记录中,呈竖状分布。监测数据表中包含测点代码、监测时间、监测项目代码、浓度测定值等,所有监测项目的浓度测定值都存储在同一个字段中,加以监测项目代码作为区分字段。
"竖表模式"的最大特点是灵活、具有较好的扩展性。针对新增监测因子,只需要在监测因子编码表进行维护,增加新的监测因子,就能满足数据存储的要求。这种设计模式非常适合自动监测站以及污染源监测数据的存储。但是"竖表模式"也有一些不足之处,比如数据可读性不好,难以表达某个点位某个时间点上的整体数据情况,不符合传统习惯的"横表"数据阅读方式。如何让"竖表"转换成"横表"是很多应用系统中都要遇到的一个问题。
现假设有一张名称为"自动站监测数据日均值表" 的数据表,详细数据如下:
测点代码
年
月
日
监测项目
污染物浓度
P001
2008
2
1
生化需氧量
298
P001
2008
2
1
总磷
0.526
P001
2008
2
1
化学需氧量
414
P001
2008
2
1
氨氮
1.09
P002
2008
2
3
生化需氧量
198
P002
2008
2
3
总磷
0.426
P002
2008
2
3
化学需氧量
314
P002
2008
2
3
总氮
3.71
为了能够将数据转换为横表形式,首先,在SQL Server 2005(或2008)数据库中建立存储过程usp_pivot。SQL创建语句如下:
CREATE PROC [dbo].[usp_pivot]
@schema_name AS sysname = N'dbo',-- 表/视图的架构
@object_name AS sysname = NULL, -- 表/视图的名称
@on_rows AS sysname = NULL, -- 分组列--可以是以,相隔的多个列
@on_cols AS sysname = NULL, -- 旋转列
@agg_func AS NVARCHAR(12) = N'MAX',-- 聚集函数
@agg_col AS sysname = NULL -- 统计列
AS
DECLARE
@object AS NVARCHAR(600),
@sql AS NVARCHAR(MAX),
@cols AS NVARCHAR(MAX),
@newline AS NVARCHAR(2),
@msg AS NVARCHAR(500);
SET @newline = NCHAR(13) + NCHAR(10);
SET @object = QUOTENAME(@schema_name) + N'.'
相关文档:
下面是操作步骤:
1. “服务和连接的外围应用配置“ -》“本地连接和远程连接”-》“同时使用TCP/IP和Named Pipes“;
2. “服务配置管理器”-》“网络配置”-》“SQL Express的协议“-》“IP地址”,将IpAll Tcp端口改为1433;
3. 重启服 ......
SQL Server 系统全局变量
@@CONNECTIONS
返回自上次启动以来连接或试图连接的次数。
@@CURSOR_ROWS
返回连接上最后打开的游标中当前存在的合格行的数量(返回被打开的游标中还未被读取的有效数据行的行数)
@@DATEFIRST
返回每周第一天的数字
@@ERROR
返回最后执行的SQL 语句的错误代码。
@@FETCH_STATUS
返回 ......
操作系统的支持 版本和发行版 实例、数据库和表空间 实例名和SID 系统数据库和系统表空间
一般的公司通常会在他们的信息系统架构中引入多种数据库平台,同时引入三到四种不同的RDBMS解决方案的中大型公司也并不少见,当然这些公司里面的DBA们通常也需要同时拥有管理多种不同平台的技能了。
只在一种平台上展开工作的数据 ......
Transact-SQL 语言使用的流程控制命令与常见的程序设计语言类似主要有以下几种控制命令。
4.6.1 IF…ELSE
其
语法如下:
IF <条件表达式>
<命令行或程序块>
[ELSE [条件表达式]
<命令行
或程序块>]
其中<条件表达式>可以是各种表达式的组合,但表达式的值必须是逻辑值“真&rdq ......