oracle 纵列 转 横列,高手帮忙 SQL语句,纵列转横列

1楼: 我的数据库是 ZZFY.MDB

数据库格式如下

项目编号 成本项目 用量金额

90012 99警察冬服

90012 付料 20.12

90012 小计 20.12

90012 动力 5.46

90012 工资 30.12

90012 福利费用 4.56

90012 制造费用 9.56

90012 合计 69.82

用SQL语句怎样实现如下查询结果?

项目编号 付料 动力 工资 福利费用 制造费用

90012 20.12 5.46 30.12 4.56 9.56

2楼: 【转贴】

1. 行列转换--普通

假设有张学生成绩表(CJ)如下

Name Subject Result

张三 语文 80

张三 数学 90

张三 物理 85

李四 语文 85

李四 数学 92

李四 物理 82

想变成

姓名 语文 数学 物理

张三 80 90 85

李四 85 92 82

declare @sql varchar(4000)

set @sql = 'select Name'

select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'

from (select distinct Subject from CJ) as a

select @sql = @sql+' from test group by name'

exec(@sql)

2. 行列转换--合并

有表A,

id pid

1 1

1 2

1 3

2 1

2 2

3 1

如何化成表B:

id pid

1 1,2,3

2 1,2

3 1

创建一个合并的函数

create function fmerg(@id int)

returns varchar(8000)

as

begin

declare @str varchar(8000)

set @str=''

select @str=@str+','+cast(pid as varchar) from 表A where id=@id

set @str=right(@str,len(@str)-1)

return(@str)

End

go

--调用自定义函数得到结果

select distinct id,dbo.fmerg(id) from 表A

3楼: select 项目编号 ,

sum(case when 成本项目='付料' then 用量金额 else 0 ) 付料,

sum(case when 成本项目='动力' then 用量金额 else 0 ) 动力,

sum(case when 成本项目='工资' then 用量金额 else 0 ) 工资,

sum(case when 成本项目='福利费用'then 用量金额 else 0 ) 福利费用,

sum(case when 成本项目='制造费用'then 用量金额 else 0 ) 制造费用

from 表名

group 项目编号

4楼: 交叉表啊 创建一个存储过程 看一下以前的帖子

CREATE PROCEDURE RobinCrossTable --交叉表生成器

--(Select Distinct SuppCode As SCode,MCode,PurQtyRate As Rate

-- From MtSPM A Inner Join MtSPD B On A.ID=B.MtSuppPriceM_ID

-- Inner Join Suppliers C On A.Supp_ID=C.ID

-- Where A.Active_KID=120 And AduitPass=1) D

@vSourceTAB As Varchar(2000), --数据来源表,可以为表,视图,或者SQL语句(要用括号以及别名:如上注释段)

@vGroupbyField As Varchar(50), --被selct Group By 要显示出来的,可以多个字段(记录可以有空值)

@vTransFormCol As Varchar(50), --交叉表中的合计等函数计算值的字段

@vFunction As Varchar(50)=' Sum', --默认值,交叉表中的函数,也可以是' 2*Sum'的计算公式

@vPivotCol As Varchar(50), --要转换成列的字段,唯一列,可以是表达式'Field1+Field2'(记录可以有空值)

@vStrWhere As Varchar(500) =Null --Where 约束条件,可以为空

AS

--重要提示:@StrSql的Largest size allowed Is 8000,因此尽量将少的字段内容转换为列

Declare @StrSql As Varchar(8000) --//总的SQL语句

Declare @StrSum As Varchar(3000) --//列合计

Declare @pCols As Varchar(100)

Declare @StrWhere As Varchar(500)

Execute('Declare CursorCross Cursor For

Select Distinct ' + @vPivotCol + ' From ' +@vSourceTAB +' Order By ' + @vPivotCol + ' For Read only ')

Begin

Set Nocount On

Set @StrSql =''

Set @StrSum=''

Set @pCols=''

IF Rtrim(Ltrim(IsNull(@vStrWhere,''))) <> ''

Begin

Set @StrWhere=' Where ' + @vStrWhere + ' '

End

Else

Set @StrWhere=''

Open CursorCross

While (0=0)

Begin

Fetch Next From CursorCross Into @pCols

IF (@@Fetch_Status<>0) Break

IF @pCols Is Null --//不为空值,

Set @pCols='Null'

--为了防止新创建的列的标题名称,与@vGroupbyField中的字段重名,

--新创建的列的标题名称都增加前缀[@vGroupbyField.新创建的列的标题名称]

--因Sql长度限制Max=8000,由源数据控制字段值不能为Null,因此这里不再检验值是否为Null

Set @StrSql=@StrSql +',' + @vFunction +

'(Case '+@vPivotCol+' When ' + @pCols+ ' Then '+@vTransFormCol +' Else Null End) As '+

'['+Left(@vPivotCol,1)+@pCols+']'

--因长度限制,不计算列间之和

-- Set @StrSum=@StrSum + '+IsNull(A.' + '['+Left(@vPivotCol,1)+@pCols+']' +',0)'

End

Set @StrSql = ' Select ' + @vGroupByField + ' ' +@StrSql + ' From ' +@vSourceTAB+ ' ' + @StrWhere +

' Group By ' + @vGroupByField

--列向合计 为字段名'TotalSum'

-- Set @StrSql ='Select A.*,(0' +@StrSum + ') As TotalSum From (' + @StrSql +') As A'

Set @StrSql ='Select A.* From ('+@StrSql+') As A'

Execute(@StrSql)

IF @@Error <>0

Return @@Error

Close CursorCross

Deallocate CursorCross

Return 0

End

5楼: 不行呀!我的数据库是 ACCESS如delphi 进销存教程

6楼: Access更加简单,专门有一条语句产生交叉表的(SQL就没有这语句)

----TRANSFORM, 你查查access帮助就有。

~~~~~~~~~

7楼: 3楼的可以啊

8楼: xianguo你好!

你提供的代码如下:

declare @sql varchar(4000)

set @sql = 'select Name'

select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'

from (select distinct Subject from CJ) as a

select @sql = @sql+' from test group by name'

exec(@sql)

怎样把你提供大代码加入到我的程序中.

procedure Txxxxx.FormCreate(Sender: TObject);

begin

ADOQuery1.Connection:=data1.database1;

ADOQuery1.SQL.Clear;

ADOQuery1.SQL.Text:=

end;

end.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值