列转行,SQL问题

stou 2007-05-04 10:58:49

f1 f2
B+C 1
B+C 2
結果
f1 f2
B 1
B 2
C 1
C 2

上次看到有,可惜找不到了。请高手帮解决下。多谢。
...全文
443 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
free_pop2k 2007-05-04
  • 打赏
  • 举报
回复
表的设计不合里,不过也可以用两种方法得到你想要的结果.
--通过函数分拆
--通过临时表
上面都写得很详细,来晚了点

帮Ding!
stou 2007-05-04
  • 打赏
  • 举报
回复
下午回来结
stou 2007-05-04
  • 打赏
  • 举报
回复
谢谢。。。
还想多问下。
原表。库存型的。不是我设计的,我说的别人不听,没办法。
类型表 producttype
producttypeid,producttypename
1 A+B+C+D
2 A+B+C
3 B+C
..
5 A
6 B
7 C
8 D
....

出库主表 deliverymain
deliverymainid producttypeid
1 1
明细 deliverydetail
deliverydetailid deliverymainid num
1 1 100
2 1 200

现在要求出每个单独产品的出库数量。
即上面写的。
A 100
B 100
C 100
D 100
A 200
B 200
C 200
D 200
解决了另发贴感谢。。。
实在是不好做。。。
dawugui 2007-05-04
  • 打赏
  • 举报
回复
if object_id('pubs..tb') is not null
drop table tb
go

create table tb(f1 varchar(10),f2 int)
insert into tb(f1,f2) values('B+C+D+E',1)
insert into tb(f1,f2) values('B+C',2)
insert into tb(f1,f2) values('B',3)
go

-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b


SELECT
f1 = SUBSTRING(tb.f1, B.ID, CHARINDEX('+', tb.f1 + '+', B.ID) - B.ID) ,
tb.f2
FROM tb, # B
WHERE SUBSTRING('+' + tb.f1, B.id, 1) = '+'
ORDER BY 1,2
GO

DROP TABLE tb,#

/*
f1 f2
---------- -----------
B 1
B 2
B 3
C 1
C 2
D 1
E 1

(所影响的行数为 7 行)
*/
dawugui 2007-05-04
  • 打赏
  • 举报
回复
--如果个数,不定,需要临时表.

if object_id('pubs..tb') is not null
drop table tb
go

create table tb(f1 varchar(10),f2 int)
insert into tb(f1,f2) values('B+C',1)
insert into tb(f1,f2) values('B+C',2)
go

-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b


SELECT
f1 = SUBSTRING(tb.f1, B.ID, CHARINDEX('+', tb.f1 + '+', B.ID) - B.ID) ,
tb.f2
FROM tb, # B
WHERE SUBSTRING('+' + tb.f1, B.id, 1) = '+'
ORDER BY 1,2
GO

DROP TABLE tb,#

/*
f1 f2
---------- -----------
B 1
B 2
C 1
C 2

(所影响的行数为 4 行)

*/
Andy__Huang 2007-05-04
  • 打赏
  • 举报
回复
如果那样的话,可能要通过存储过程转换好一些
dawugui 2007-05-04
  • 打赏
  • 举报
回复
if object_id('pubs..tb') is not null
drop table tb
go

create table tb(f1 varchar(10),f2 int)
insert into tb(f1,f2) values('B+C',1)
insert into tb(f1,f2) values('B+C',2)
go

select left(f1,charindex('+',f1)-1) f1 , f2 from tb
union all
select substring(f1,charindex('+',f1)+1 , len(f1) - charindex('+',f1)) f1 , f2 from tb

drop table tb

/*
f1 f2
---------- -----------
B 1
B 2
C 1
C 2

(所影响的行数为 4 行)
*/
stou 2007-05-04
  • 打赏
  • 举报
回复
还有点问题。
我那个f1 可以是 B+C+D+E...
也可是单的。
stou 2007-05-04
  • 打赏
  • 举报
回复
试下先。行就立即结。谢谢。
stou 2007-05-04
  • 打赏
  • 举报
回复
问题不明确,也请帮下忙,刚才搜了下找不着。
Andy__Huang 2007-05-04
  • 打赏
  • 举报
回复
select f1=left(f1,charindex('+',f1)-1),f2
from tb
where charindex('+',f1)>0
union all
select f1=substring(f1,charindex('+',f1)+1,len(f1)-charindex('+',f1)),f2
from tb
where charindex('+',f1)>0
union all
select f1,f2
from tb
where charindex('+',f1)=0
Andy__Huang 2007-05-04
  • 打赏
  • 举报
回复
这个应该是列分解的问题
stou 2007-05-04
  • 打赏
  • 举报
回复
先结,另发贴了。

34,590

社区成员

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

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