原文 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. Python之路Day17

    算法:冒泡排序.插入排序.快速排序.堆排序 冒泡排序 #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "Q1mi& ...

  2. oracle 10g函数大全--分析函数

    oracle分析函数--SQL*PLUS环境 一.总体介绍 12.1 分析函数如何工作 语法 FUNCTION_NAME(<参数>,…) OVER (<PARTITION BY 表达 ...

  3. 转:STL容器里存放对象还是指针

    一.问题的引出: 容器可以存放对象,可以存放指针,这里要谈的是两者的使用问题.就是什么时候存放对象更好,什么时候存放指针更好? 二.问题的分析过程: 1. 首先说下stl容器的工作方式   对于内建类 ...

  4. [K/3Cloud] 如何从被调用的动态表单界面返回数据

    在需要返回数据的地方调用表单返回方法完成数据返回 this.View.ReturnToParentWindow(retData); 在调用界面的回调函数中取出返回结果的ReturnData即可使用. ...

  5. java.lang.Math类,方法学习笔记

    /**java.lang 包中的Math 类提供有常量 * 并包含有用于执行基本数学运算的 * 方法,如初等指数.对数.平方根 * 用于进行更高级的数学运算.由于 * 在Math 类的方法都是静态的, ...

  6. 奔小康赚大钱(km)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  7. apache2.4.x三种MPM介绍

    三种MPM介绍                                                                               Apache 2.X  支持 ...

  8. ThinkPHP - Widget 工具

    提出问题:widget能实现什么功能? 显示右侧博文: 1.首先在Home目录下新建Widget文件夹,之后建立对应文件 2.拿最热Hot新闻来举例: 在Tpl目录下Common公共文件夹里的righ ...

  9. [Swust OJ 137]--波浪数(hash+波浪数构造)

    题目链接:http://acm.swust.edu.cn/problem/137/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  10. video.js的使用

    跨浏览器地播放视频,在网上找了一下,找到了video.js,记录一下video.js的简单用法. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 ...