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

原创 2007年09月27日 10:20:00

/*
* 针对纵向转横向的模型
*/
GO
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'
*/ 

数据库纵向记录横向显示

数据库表中这样把横向记录纵向显示       普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数...
  • GeneralYY0
  • GeneralYY0
  • 2012年08月20日 12:39
  • 4691

SQL如何将表中的数据从纵向显示转换成横向显示

在网上看到很多人关于这个问题的解答,但笔者都觉得不满意,在此我想给出最简单的答案表名:成绩表 T_Score(sno)学号 (KC)课程 (Score)成绩 04105124 会计 850410512...
  • yufangbo
  • yufangbo
  • 2008年01月12日 16:00
  • 1799

sql语句纵向转横向

mysql中的case when语句查询结果问题 数据库中的测试数据 现在我想让他显示的结果是 :姓名 语文 数学 物理 这种形式的(就是行转列) sql语句1: 这个结果是不...
  • akzwakzw
  • akzwakzw
  • 2017年11月21日 10:12
  • 470

数据库表中横向记录纵向显示

  • 2009年08月13日 10:17
  • 15KB
  • 下载

SQL中如何将表的查询结果纵向显示(个人思路总结)

SQL中如何将表的查询结果纵向显示(初学者个人思路总结)下面看例子: OOrders表结构是这样的 现在要查询Customer的不同名字分别有多少个,并且要如下显示: 1、于是我...
  • meloyi
  • meloyi
  • 2015年03月25日 17:32
  • 1333

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

drop procedure Model_his_mid;GOcreate procedure Model_his_mid(/* * @vColumns    分组的列 (最后一个字段后面一定不要加,...
  • williamzhengguohui
  • williamzhengguohui
  • 2010年10月26日 10:32
  • 733

SQL 如何查询时竖着的数据横着显示

今天建表的时候遇到一些问题,百度了,也想了一些,总结一下。 姓名 科目 分数 王明 数学 100 王明 语文 100 王明 英语 100 显示成 姓名 数学 ...
  • z_zT_T
  • z_zT_T
  • 2016年03月15日 22:09
  • 2456

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

/** 针对纵向转横向的模型*/GOdrop procedure Model_his_mid;GOcreate procedure Model_his_mid(/* * @vColumns   分组的...
  • nina36633640
  • nina36633640
  • 2007年09月27日 10:20
  • 1264

纵向查询显示小示例

--初始化环境create table grade(Code  int not null,Name  varchar(10),Scores int)--测试数据insert into grade se...
  • CQP
  • CQP
  • 2006年08月31日 23:32
  • 892

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

/*create table BookLibary([图书馆] varchar(10), [科目] varchar(10), [数量] int) insert into BookLibary se...
  • david_520042
  • david_520042
  • 2012年02月14日 08:01
  • 1420
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sql查询结果的纵向变横向排列
举报原因:
原因补充:

(最多只允许输入30个字)