求横表与竖表的转换算法

epsonhan 2006-11-16 06:55:16
tabel :Product

姓名 牙膏 肥皂 电池
张三 100 102 220
李四 50 78 200

结果

姓名 产品 数量
张三 牙膏 100
张三 肥皂 102
张三 电池 220
李四 牙膏 50
李四 肥皂 78
李四 电池 200

如果再把竖表转换成横表呢?
...全文
276 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tigersong 2006-11-16
  • 打赏
  • 举报
回复
如果是2005的话很简单的说:

create table a(姓名 varchar(20),牙膏 int,肥皂 int,电池 int)

insert into a
select '张三',100,102,220
union all
select '李四',50,78,200

select 姓名,产品,数量
from (select 姓名,牙膏,肥皂,电池 from a ) as p
UNPIVOT
(数量 FOR 产品 IN
(牙膏,肥皂,电池)
)AS unpvt

dragonlhd 2006-11-16
  • 打赏
  • 举报
回复
case when 语句很好用啊

select a.姓名,
max(case a.产品 when '牙膏' then a.数量 end) as '牙膏',
max(case a.产品 when '肥皂' then a.数量 end) as '肥皂',
...
from products a
group by a.姓名
DDDDDDDDDDDDDDDDDD 2006-11-16
  • 打赏
  • 举报
回复
select *from table4 --原表

create table t(姓名 varchar(8), 产品 varchar(8), 数量 int)

declare @a1 varchar(20),@a2 int,@a3 int,@a4 int
declare LS cursor for select 姓名 , 牙膏 , 肥皂 , 电池 from table4
open LS
fetch LS into @a1,@a2,@a3,@a4
while @@fetch_status=0
begin
insert into t select @a1,'牙膏',@a2
insert into t select @a1,'肥皂',@a3
insert into t select @a1,'电池',@a4
fetch LS into @a1,@a2,@a3,@a4
end

close LS
deallocate LS
select *from t --结果
hhhdyj 2006-11-16
  • 打赏
  • 举报
回复
列固定时用
SELECT 姓名, '牙膏' AS 产品, 牙膏 AS 数量 UNION ALL
SELECT 姓名, '肥皂' AS 产品, 肥皂 AS 数量 UNION ALL
SELECT 姓名, '电池' AS 产品, 电池 AS 数量
kunaola 2006-11-16
  • 打赏
  • 举报
回复
用union all

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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