Creating Cross Tab Queries in SQL Server

博客展示了SQL中创建存储过程SimpleXTab的代码,包含变量声明、游标使用等操作。还以NorthWind为例,创建视图vw_SampleQuery,并给出执行该存储过程的语句,最后提供了相关资料的网址。
None.gif SET  QUOTED_IDENTIFIER  OFF  
None.gif
GO
None.gif
SET  ANSI_NULLS  OFF  
None.gif
GO
None.gif
None.gif
CREATE   PROCEDURE   [ dbo ] . [ SimpleXTab ]   @XField   varChar ( 20 ),  @XTable   varChar ( 20 ),
None.gif
@XWhereString   varChar ( 250 ),  @XFunction   varChar ( 10 ),  @XFunctionField   varChar ( 20 ),  @XRow   varchar ( 40 )
None.gif 
AS
None.gif
Declare   @SqlStr   nvarchar ( 4000 )
None.gif
Declare   @tempsql   nvarchar ( 4000 )
None.gif
Declare   @SqlStrCur   nvarchar ( 4000 )
None.gif
Declare   @col   nvarchar ( 100 )
None.gif
None.gif
set   @SqlStrCur   =  N ' Select [ '   +   @XField   +   ' ] into ##temptbl_Cursor from [ '   +   @XTable   +   ' ]   '   +   @XWhereString   +   '  Group By [ '   +   @XField   +   ' ] '
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /* select @sqlstrcur */
None.gif
exec  sp_executesql  @sqlstrcur
None.gif
None.gif
None.gif
None.gif 
declare  xcursor  Cursor    for    Select   *   from  ##temptbl_Cursor 
None.gif
None.gif 
open  xcursor 
None.gif
None.gif
None.gif 
Fetch   next   from   xcursor 
None.gif 
into   @Col  
None.gif 
None.gif
None.gif
While   @@Fetch_Status   =   0
None.gif
Begin
None.gif  
set   @Sqlstr   =   @Sqlstr   +  ", "
None.gif  
set   @tempsql   =   isnull ( @sqlstr , '' +   isnull ( @XFunction   +   ' ( Case When  '   +   @XField   +  "  =   ' " +@Col +
None.gif                           "
'   then   [ " + @XFunctionField + " ]   Else   0   End As   [ " + @XFunction + @Col + " ] " , '' )
None.gif  
set   @Sqlstr   =   @tempsql
None.gif  
Fetch   next   from  xcursor  into   @Col
None.gif 
None.gif
End
None.gif
None.gif
ExpandedBlockStart.gifContractedBlock.gif 
/**/ /* Select @Sqlstr as [mk], len(@sqlstr) as [leng] */
None.gif
None.gif 
set   @tempsql   =   ' Select  '    +   @XRow   +   ' '   +   @Sqlstr   +   '  From  '   +   @XTable   +
None.gif                             
@XWhereString   +    '  Group by  '   +   @XRow
None.gif 
set   @Sqlstr   =   @tempsql
None.gif
None.gif 
Close  xcursor
None.gif 
Deallocate  xcursor  
None.gif
None.gif  
set   @tempsql   =  N ' Drop Table ##temptbl_Cursor '
None.gif  
exec  sp_executesql  @tempsql
None.gif
ExpandedBlockStart.gifContractedBlock.gif 
/**/ /*  Select @Sqlstr as [mk], len(@sqlstr) as [leng] */
None.gif
None.gif   
exec  sp_executesql  @Sqlstr
None.gif
GO
None.gif
SET  QUOTED_IDENTIFIER  OFF  
None.gif
GO
None.gif
SET  ANSI_NULLS  ON  
None.gif
GO


以NorthWind举例说明使用情况:
先建个View:
None.gif SET  QUOTED_IDENTIFIER  ON  
None.gif
GO
None.gif
SET  ANSI_NULLS  ON  
None.gif
GO
None.gif
None.gif
CREATE   VIEW  dbo.vw_SampleQuery
None.gif
AS
None.gif
SELECT      dbo.Orders.ShipName, dbo.Categories.CategoryName, dbo.Orders.ShipCountry, (dbo. [ Order Details ] .UnitPrice  *  dbo. [ Order Details ] .Quantity) 
None.gif                      
*  ( 1   -  dbo. [ Order Details ] .Discount)  AS  OrderAmt
None.gif
FROM          dbo.Orders  INNER   JOIN
None.gif                      dbo.
[ Order Details ]   ON  dbo.Orders.OrderID  =  dbo. [ Order Details ] .OrderID  INNER   JOIN
None.gif                      dbo.Products 
ON  dbo. [ Order Details ] .ProductID  =  dbo.Products.ProductID  INNER   JOIN
None.gif                      dbo.Categories 
ON  dbo.Products.CategoryID  =  dbo.Categories.CategoryID
None.gif
None.gif
GO
None.gif
SET  QUOTED_IDENTIFIER  OFF  
None.gif
GO
None.gif
SET  ANSI_NULLS  ON  
None.gif
GO
None.gif

执行下面的语句:
None.gif Execute  SimpleXTab  ' CategoryName ' ' vw_SampleQuery ' '' ' Sum ' ' OrderAmt ' ' ShipCountry '
效果图:
figure2.jpg

这些资料来自以下这个网址:
http://www.oreillynet.com/pub/a/network/2004/12/17/crosstab.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值