SQL 查询结果的纵向变横向排列

  drop   procedure  Model_his_mid;
GO
create   procedure  Model_his_mid(
/* 
* @vColumns    分组的列 (最后一个字段后面一定不要加,)
* @vClause    查询表的条件(没有条件='')
* @vOrderby    查询结果排序的字段 ''为默认排序
* @vTop      取出的行数 ''为全部
*/

@vColumns   nvarchar ( 1000 ),
@vClause   nvarchar ( 4000 ),
@vOrderby   nvarchar ( 100 ),
@vTop   nvarchar ( 50 )
)
as

declare   @sql   nvarchar ( 4000 )
declare   @xColumns   nvarchar ( 4000 )

declare   @vTable   nvarchar ( 50 )
declare   @vColumnName   nvarchar ( 100 )
declare   @vSumColName   nvarchar ( 100 )
declare   @vNum   nvarchar ( 50 )
declare   @vAllNum   nvarchar ( 50 )
declare   @vSumOrCount   nvarchar ( 50 )

set   @xColumns   =   ''

/*
* 需要赋值的参数
*
* @vTable     真正查询的表名
* @vColumnName 纵向转横向的列名
* @vSumColName 取合计值的列名
* @vNum      数值的别名
* @vAllNum    每行合计的列名 (如果不要合计则='')
* @vSumOrCount sum或者count

*/

set   @vTable   =   ' his_mid_tab '
set   @vColumnName   =   ' hsks '
set   @vSumColName   =   ' qty '
set   @vNum   =   ' num '
set   @vAllNum   =   ' allnum '
set   @vSumOrCount   =   ' sum '

select  
@xColumns   =   @xColumns
+   ' sum(case  '   +   @vColumnName   +   '  when  ' +   char ( 39 +   [ a ] . [ column ]   +   char ( 39 ) +   '  then  '   +   @vNum   +   '  else 0 end) as  '''
+   [ a ] . [ column ]   +   ''' '

/*
* 需要比例加入此语句
* + '(' + 'cast(round(sum(case ' + @vColumnName + ' when '+ char(39) + [a].[column] + char(39)+ ' then ' + @vNum + ' else 0 end)*100.00' + '/sum(' + @vNum + '),2) as decimal(10,2))) as ' + [a].[column] + '_i, '
*/


/**
* 要动态显示列的sql语句 住院 OUTP_OR_INP = '0' 门诊OUTP_OR_INP = '1'
*/

from  ( select   distinct  DEPT_NAME  as   [ column ]   from  his_mzkm_tab  where  OUTP_OR_INP  =   ' 0 ' as  a

set   @xColumns   =   substring ( @xColumns 0 len ( @xColumns ))

set   @sql   =   ' select  '

if ( @vTop   <>   '' )
set   @sql   =   @sql   +   ' top  '   +   @vTop   +   '   '

set   @sql   =   @sql   +   @vColumns   +   ' '   +   @xColumns

if ( @vAllNum   <>   '' )
set   @sql   =   @sql   +   ' , sum( '   +   @vNum   +   ' ) as  '   +   @vAllNum

set   @sql   =   @sql   +   '  from ( '
+   ' select  '   +   @vColumns   +   ' '   +   @vColumnName   +   ' '   +   @vSumOrCount   +   ' ( '   +   @vSumColName   +   ' ) as  '   +   @vNum   +   '  from  '   +   @vTable
if ( @vClause   <>   '' )
set   @sql   =   @sql   +   '  where  '   +   @vClause

set   @sql   =   @sql   +   '  group by  '   +   @vColumns   +   ' '   +   @vColumnName

set   @sql   =   @sql   +   ' ) as casual_table group by  '   +   @vColumns   +   '   '

if ( @vOrderby   <>   '' )
set   @sql   =   @sql   +   ' order by  '   +   @vOrderby
print   @sql
exec  sp_executesql  @sql   with  recompile


/*
* sql语句 引号之内的为sql中的几个参数分别为(分组的列,条件,排序,取出行数)
* exec Model_his_mid 'kjkm','date = ''8''','kjkm desc',''
*/



/*
* sql语句
* exec Model_his_mid 'kjkm','','kjkm desc','15'
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值