原文 http://www.gyurcit.hu/pivot.html

Dynamic Pivot table wizard

This stored procedure generate dynamic crosstable with multiple pivot columns by 4+1 parameters.

1. P_Row_Field Name of field that reperesent the spreadsheet's rows
2. P_Column_Field Name of field that store the name of columns
3. P_Value Name of field that represent the spreedsheet's value
4. P_From Name of source table
5. P_Where Filter expression (optional)

Values of second parameter field should not include apastrophe.  Procedure does not check paramaters (you must do that), so it may causes sql injection attack.

To source code click one of them

 
-- =================================================
-- Pivot Table Wizard (c) 2009 by GyurcIT
-- http://www.gyurcit.hu e-mail: gyurcit@gmail.com
-- ================================================= IF EXISTS (SELECT name FROM sysobjects
WHERE name = N'PivotWizard' AND type = 'P')
DROP PROCEDURE PivotWizard
GO
-----------------------------------------------------
-----------------------------------------------------
CREATE PROCEDURE PivotWizard
@P_Row_Field VARCHAR(255),
@P_Column_Field VARCHAR(255),
@P_Value VARCHAR(255),
@P_From VARCHAR(4000),
@P_Where VARCHAR(4000) = '1=1'
AS DECLARE @SQL NVARCHAR(4000) -- Build SQL statment that upload @Columns string
  -- with @P_Column_Filed values
CREATE TABLE #TEMP (ColumnField varchar(100))
SET @sql ='SELECT DISTINCT '+@P_Column_Field+' AS ColumnField'+
' FROM '+@P_From+
' WHERE '+@P_Where+
' ORDER BY '+@P_Column_Field
INSERT INTO #TEMP
EXEC(@sql)
PRINT @sql -- Check count of columns
DECLARE @Count_Columns int
SELECT @Count_Columns = COUNT(*) FROM #Temp
IF (@Count_Columns<1) OR (@Count_Columns>255) BEGIN
DROP TABLE #Temp
RAISERROR('%d is invalid columns amount. Valid is 1-255',
16,1,@Count_columns)
RETURN
END
-- Upload @Columns from #Temp
DECLARE @Columns VARCHAR(8000),
@Column_Field VARCHAR(8000) SET @Columns = ''
DECLARE Column_cursor CURSOR LOCAL FOR
SELECT CAST(ColumnField AS VARCHAR(60))
FROM #Temp
OPEN Column_cursor
FETCH NEXT FROM Column_cursor
INTO @Column_Field
WHILE @@FETCH_STATUS = 0 BEGIN
SET @Columns = @Columns +
' SUM('+
' CASE WHEN '+@P_Column_Field+'='''+ @Column_Field+''''+
' THEN '+@P_Value+
' ELSE 0 END'+
') AS ['+ @Column_Field +'], '
FETCH NEXT FROM Column_cursor
INTO @Column_Field
END
CLOSE Column_cursor
DEALLOCATE Column_cursor
DROP TABLE #Temp IF @Columns='' RETURN 1
SET @Columns = Left(@Columns,Len(@Columns)-1) -- Build Pivot SQL statment
DECLARE @Pivot_SQL VARCHAR(8000)
SET @Pivot_SQL = 'SELECT ' +@P_Row_Field+', '+@Columns
SET @Pivot_SQL = @Pivot_SQL +' FROM ' +@P_From
SET @Pivot_SQL = @Pivot_SQL +' WHERE ' +@P_Where
SET @Pivot_SQL = @Pivot_SQL +' GROUP BY '+@P_Row_Field
SET @Pivot_SQL = @Pivot_SQL +' ORDER BY '+@P_Row_Field
SET @Pivot_SQL = @Pivot_SQL + '#' IF Right(@Pivot_SQL,1)<>'#'
BEGIN
RAISERROR('SQL statement is too long. It must be less
                than 8000 charachter!',16,1)
RETURN 1
END
SET @Pivot_SQL = Left(@Pivot_SQL,Len(@Pivot_SQL)-1) -- PRINT @Pivot_SQL
EXEC(@Pivot_SQL) RETURN 0
GO -- Example use Northwind database --
-- Example 1 --
exec PivotWizard 'ShipCountry',
'YEAR(OrderDate)*100+Month(OrderDate)',
'[ExtendedPrice]',
'dbo.Invoices',
'OrderDate BETWEEN ''1996/01/01'' and ''1996/12/31''' GO -- Example 2 --
exec PivotWizard 'ProductName',
'ShipCountry',
'[ExtendedPrice]',
'dbo.Invoices',
'OrderDate BETWEEN ''1996/01/01'' and ''1996/12/31'''
-- =================================================
-- Pivot Table Wizard MySQL (c) 2009 by GyurcIT
-- http://www.gyurcit.hu e-mail: gyurcit@gmail.com
-- =================================================
-- USE Database
DROP PROCEDURE IF EXISTS pivotwizard; CREATE DEFINER = 'root'@'192.168.1.119'
PROCEDURE pivotwizard(
IN P_Row_Field VARCHAR(255),
IN P_Column_Field VARCHAR(255),
IN P_Value VARCHAR(255),
IN P_From VARCHAR(4000),
IN P_Where VARCHAR(4000))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE M_Count_Columns int DEFAULT 0;
DECLARE M_Column_Field varchar(60);
DECLARE M_Columns VARCHAR(8000) DEFAULT '';
DECLARE M_sqltext VARCHAR(8000);
DECLARE M_stmt VARCHAR(8000);
DECLARE cur1 CURSOR FOR SELECT CAST(Column_Field AS CHAR) FROM Temp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; DROP TABLE IF EXISTS Temp;
SET @M_sqltext = CONCAT('CREATE TEMPORARY TABLE Temp ',
' SELECT DISTINCT ',P_Column_Field,
				' AS Column_Field',
' FROM ',P_From,
' WHERE ',P_Where,
' ORDER BY ', P_Column_Field); PREPARE M_stmt FROM @M_sqltext;
EXECUTE M_stmt; SELECT COUNT(*) INTO M_Count_Columns
 FROM Temp 
 WHERE Column_Field IS NOT NULL;

 IF (M_Count_Columns > 0) THEN
OPEN cur1;
REPEAT
FETCH cur1 INTO M_Column_Field;
IF (NOT done) and (M_Column_Field IS NOT NULL) THEN
SET M_Columns = CONCAT(M_Columns,
' SUM( CASE WHEN ',P_Column_Field,'=''',M_Column_Field,'''',
' THEN ',P_Value,
' ELSE 0 END) AS `', M_Column_Field ,'`,'); END IF;
UNTIL done END REPEAT;
    SET M_Columns = Left(M_Columns,Length(M_Columns)-1);
SET @M_sqltext = CONCAT('SELECT ',P_Row_Field,',',M_Columns,
' FROM ', P_From,
' WHERE ', P_Where,
' GROUP BY ', P_Row_Field,
' ORDER BY ', P_Row_Field); PREPARE M_stmt FROM @M_sqltext;
EXECUTE M_stmt;
END IF;
END
-- Example:
CALL pivotwizard('article','Month(date)',
'netto',
'invoice',
'(year(date)=2009)')

 

Dynamic Pivot table wizard SQL Server的更多相关文章

  1. Microsoft: Get started with Dynamic Data Masking in SQL Server 2016 and Azure SQL

    Dynamic Data Masking (DDM) is a new security feature in Microsoft SQL Server 2016 and Azure SQL DB. ...

  2. How can I list all foreign keys referencing a given table in SQL Server?

    How can I list all foreign keys referencing a given table in SQL Server?  how to check if columns in ...

  3. [转]How can I list all foreign keys referencing a given table in SQL Server?

    本文转自:https://stackoverflow.com/questions/483193/how-can-i-list-all-foreign-keys-referencing-a-given- ...

  4. SQL Server里PIVOT运算符的”红颜祸水“

    在今天的文章里我想讨论下SQL Server里一个特别的T-SQL语言结构——自SQL Server 2005引入的PIVOT运算符.我经常引用这个与语言结构是SQL Server里最危险的一个——很 ...

  5. SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)

    原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一 ...

  6. Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

    1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过row ...

  7. 转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

    0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Us ...

  8. Microsoft SQL Server Version List [sqlserver 7.0-------sql server 2016]

    http://sqlserverbuilds.blogspot.jp/   What version of SQL Server do I have? This unofficial build ch ...

  9. Microsoft SQL Server Version List(SQL Server 版本)

    原帖地址 What version of SQL Server do I have? This unofficial build chart lists all of the known Servic ...

随机推荐

  1. django 基础入门(二)

    一.关于数据库 1.首先django 1.9以上等版本不支持pymysql,因此需要做一些调整. 比如在settings.py 加入一段代码: import pymysql pymysql.insta ...

  2. C# Programming Study #2

    readonly (C# Reference) readonly  关键字是可以在字段上使用的修饰符.  当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者 ...

  3. C#设置窗体最大化且不遮挡任务栏的方法

    C#设置窗体最大化示例: 也可将方法内的内容放到主窗体首次加载load方法中. /// <summary> /// 设置窗体最大化(不遮挡任务栏)但此方法在宽屏中不能显示全屏/// < ...

  4. dubbo 服务化

    当网站变大后,不可避免的需要拆分应用进行服务化,以提高开发效率,调优性能,节省关键竞争资源等. 当服务越来越多时,服务的URL地址信息就会爆炸式增长,配置管理变得非常困难,F5硬件负载均衡器的单点压力 ...

  5. 第一种:NStread

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  6. [ArcGIS必打补丁]ArcGIS 10.1 SP1 for (Desktop, Engine, Server) Quality Improvement Patch

    大家都知道假设希望保证企业级GIS系统的稳定执行,除了使用最新的ArcGIS版本号产品以外,还须要打上相关的补丁. 补丁分为:Service Pack和Patch 比如,假设你使用的ArcGIS10. ...

  7. pkg_utility

    创建包名: CREATE OR REPLACE PACKAGE BODY PKG_UTILITY AS --字符串转换到索引表 PROCEDURE STR_TO_LIST(PI_STR IN VARC ...

  8. NHibernate变的简单

    前言 这篇文章出自于我尝试学习使用Nhiberbnate的挫败感.我发现好像Nhibernate全部的介绍材料不是很模糊就是太详细.我所需要的就是一个简单直接的教程,能让我尽快对NHibernate熟 ...

  9. Hibernate MySQL 数据库 使用别名 报 Column * Not Found

    使用Hibernate 查询MySQL数据表的时候报 Column Not Found ,原因是MySQL的驱动不支持别名, 解决方案如下,在连接参数中加上 useOldAliasMetadataBe ...

  10. vim的漫漫长征路

    在系统的学习vim之前,先在网上找了些教程大概了解下,因为首先我们要先将vim给用起来,然后在系统的学习过程中不断的充实自己对vim的理解. ----------------------------- ...