Dynamic Pivot table wizard SQL Server
原文 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的更多相关文章
- 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. ...
- 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 ...
- [转]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- ...
- SQL Server里PIVOT运算符的”红颜祸水“
在今天的文章里我想讨论下SQL Server里一个特别的T-SQL语言结构——自SQL Server 2005引入的PIVOT运算符.我经常引用这个与语言结构是SQL Server里最危险的一个——很 ...
- SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)
原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一 ...
- Sql Server中的表访问方式Table Scan, Index Scan, Index Seek
1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过row ...
- 转: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 ...
- 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 ...
- 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 ...
随机推荐
- [LeetCode]题解(python):021-Merge Two Sorted Lists
题目来源: https://leetcode.com/problems/merge-two-sorted-lists/ 题意分析: 题目给出两个排好序的链表,将这两个链表整合成一个新的有序的链表. 题 ...
- 转:用JS判断IE浏览器的版本(-- 很巧妙实用的方法)
~~在看到这篇文章之前如果让我来判断IE的版本,那么我基本上会用 navigator.userAgent去做字符串检索,现在觉得特性检测的确比较靠谱一点 今天一个项目中需要判断IE版本号,又因为 jQ ...
- myeclipse部署时An internal error occurred 错误的几种情况
myecplise上将工程部署到应用下时,经常出现 An internal error occurred during: "Add Deployment". java.lang.N ...
- Ubuntu安装Adobe Reader
到 这里依次选择最新版本的Adobe Reader,我选择目前最新的 9.5.5版本的,下载下来后,双击选择dep包,启动软件中心进行安装,中间会提示软件包欠佳,选择" ...
- 基于visual Studio2013解决C语言竞赛题之0404循环求和
题目 解决代码及点评 这道题考验for循环和一个简单的算法 因为每次累加的值有规律,后面一次累加是前面一次累加的两倍 所以可以用简单的循环,计算累加项和累加结果 /************ ...
- 动态弹球的实现 加入了多线程技术--javaSE游戏准备工作
任务描述:实现了动态弹球的功能,对于有弹球功能的SE游戏奠定了基础. package 运用线程技术的小球; import java.awt.*; import java.awt.event.*; im ...
- STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...
- c++,static 静态成员变量 / 静态成员函数
静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...
- H-JATG:NAND_FLASH的参数设置
JATG:NAND_FLASH 不同的cpu同一款flash: 相同的cpu不同的flash: 相同的cpu不同厂家的的flash:
- thiscall仅仅应用于“C++”成员函数(this指针存放于CX寄存器,参数从右到左压)
_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上" ...