求行转列的SQL语句,谢谢!

ricleon 2011-07-04 04:52:25

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Flhz]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Flhz]
GO

CREATE TABLE [dbo].[Flhz] (
[编码] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[类型] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[金额] [numeric](18, 2) NULL
) ON [PRIMARY]
GO



insert into flhz values( '01','口服',12.5)
insert into flhz values( '01','注射',13.5)
insert into flhz values( '01','其他',14.5)
insert into flhz values( '02','口服',12.5)
insert into flhz values( '02','注射',2.5)
insert into flhz values( '02','其他',6.5)
insert into flhz values( '03','口服',7.5)
insert into flhz values( '03','注射',11.5)
insert into flhz values( '03','其他',23.5)


我想得到结果
---编码 口服 注射 其他
01 12.5 13.5 14.5
02 12.5 2.5 6.5
03 7.5 11.5 23.5

应该如何写,谢谢!
...全文
45 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ricleon 2011-07-04
  • 打赏
  • 举报
回复
7楼可以,因为类型是动态的
chuanzhang5687 2011-07-04
  • 打赏
  • 举报
回复
select [编码] as [编码] ,
max(case [类型] when '口服' then [金额] else 0 end) 口服,
max(case [类型] when '注射' then [金额] else 0 end) 注射,
max(case [类型] when '其他' then [金额] else 0 end) 其他
from dbo.Flhz
group by [编码]--这个比较好理解
viqn7qdnt 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ricleon 的回复:]
那应该怎么办?
[/Quote]
1L,7L应该都可用的,你试试看
viqn7qdnt 2011-07-04
  • 打赏
  • 举报
回复

declare @sql varchar(8000)
set @sql = 'select [编码] '
select @sql = @sql + ' , max(case [类型] when ''' + 类型 + ''' then [金额] else 0 end) [' + 类型 + ']'
from (select distinct 类型 from Flhz) as a
set @sql = @sql + ' from Flhz group by [编码]'
exec(@sql)
ricleon 2011-07-04
  • 打赏
  • 举报
回复
那应该怎么办?
viqn7qdnt 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ricleon 的回复:]
我的是2000,
看不董。。。
复制了语句,报pivot附近语法错误
[/Quote]

2000的,pivot用不了
ricleon 2011-07-04
  • 打赏
  • 举报
回复
我的是2000,
看不董。。。
复制了语句,报pivot附近语法错误
gw6328 2011-07-04
  • 打赏
  • 举报
回复
太多行转列了。这是为什么?
GoAwayZ 2011-07-04
  • 打赏
  • 举报
回复
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Flhz]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Flhz]
GO

CREATE TABLE [dbo].[Flhz] (
[编码] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[类型] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[金额] [numeric](18, 2) NULL
) ON [PRIMARY]
GO

insert into flhz values( '01','口服',12.5)
insert into flhz values( '01','注射',13.5)
insert into flhz values( '01','其他',14.5)
insert into flhz values( '02','口服',12.5)
insert into flhz values( '02','注射',2.5)
insert into flhz values( '02','其他',6.5)
insert into flhz values( '03','口服',7.5)
insert into flhz values( '03','注射',11.5)
insert into flhz values( '03','其他',23.5)

declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + [类型] from Flhz group by [类型]
set @sql = '[' + @sql + ']'
exec ('select * from Flhz a pivot (max([金额]) for [类型] in (' + @sql + ')) b')

/*
编码 口服 其他 注射
-------------------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
01 12.50 14.50 13.50
02 12.50 6.50 2.50
03 7.50 23.50 11.50

(3 行受影响)
viqn7qdnt 2011-07-04
  • 打赏
  • 举报
回复

select [编码] as [编码] ,
max(case [类型] when '口服' then [金额] else 0 end) 口服,
max(case [类型] when '注射' then [金额] else 0 end) 注射,
max(case [类型] when '其他' then [金额] else 0 end) 其他
from dbo.Flhz
group by [编码]

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧