交错的横列变化,如何处理(急!)

qulie 2004-08-10 05:24:53
有如下一表:字段如下
门店 营业单 审核人 日期 商品1 单价1 折扣 商品2 单价2 折扣2 商品3 单价3 折扣3
A 1 aa 2004-5-1 1 12 0.8
B 2 bb 2004-5-3 2 8 0.5 3 45 0.9
C 3 cc 2004-6-1 4 6 0.9 4 22 0.6 5 33 0.8
D 6 dd 2004-7-1 6 10 0.5 3 45 0.9
、、、、、、

对于一营业单号,最多会有3种商品,最少一种,商品个数不确定
先要实现如下格式

门店 营业单号 商品 单价 折扣 审核人 日期
A 1 1 12 0.8 aa 2004-5-1
------------------------------------------------------------
B 2 2 8 0.5 bb 2004-5-3
3 45 0.9
----------------------------------------------------------
C 3 4 6 0.9 cc 2004-6-1
4 22 0.6
5 33 0.8
------------------------------------------------------------
D 6 6 10 0.5 dd 2004-7-1
3 45 0.9

、、、、、
请问如何处理
...全文
163 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qulie 2004-08-11
  • 打赏
  • 举报
回复
多谢 hmily1688(没什么好说的)!
还问一个问题:
对于这格式,
门店 营业单 商品 单价 折扣 审核人 日期
A 1 1 12.00 0.80 aa 2004-05-01 00:00:00
B 2 2 8.00 0.5 bb 2004-05-03 00:00:00
B 2 3 45.0000 0.90 NULL NULL
C 3 4 6.0000 0.90 cc 2004-06-01 00:00:00
C 3 4 22.0000 0.6 NULL NULL
C 4 5 33.0000 0.80 NULL NULL
A 5 5 33.0000 0.80 NULL NULL
B 6 6 10.0000 0.5 NULL NULL

我想处理成如下格式:
门店 营业单 商品 单价 折扣 审核人 日期
A 1 1 12.00 0.80 aa 2004-05-01 00:00:00
5 5 33.0000 0.80 NULL NULL
B 2 2 8.00 0.5 bb 2004-05-03 00:00:00
3 45.0000 0.90 NULL NULL
6 6 10.0000 0.5 NULL NULL

C 3 4 6.0000 0.90 cc 2004-06-01 00:00:00
4 22.0000 0.6 NULL NULL
4 5 33.0000 0.80 NULL NULL


cdsgajxlp 2004-08-11
  • 打赏
  • 举报
回复
帮你up
hmily1688 2004-08-11
  • 打赏
  • 举报
回复
其实可以用表变量来搞定
--测试创建表

create table hahaha(门店 varchar(10),营业单 int,审核人 varchar(10),日期 smalldatetime,
商品1 int,单价1 money,折扣 float,商品2 int,单价2 money,折扣2 float,
商品3 int,单价3 money,折扣3 float)

insert test
select 'A',1,'aa','2004-5-1',1,12,0.8,null,null,null,null,null,null
union
select 'B',2,'bb','2004-5-3',2,8,0.5,3,45,0.9,null,null,null
union
select 'C',3,'cc','2004-6-1',4,6,0.9,4,22,0.6,5,33,0.8
union
select 'D',6,'dd','2004-7-1',null,null,null,6,10,0.5,3,45,0.9

declare @aaa table(门店 varchar(10),营业单 int,商品 int,单价 money,
折扣 float,审核人 varchar(10), 日期 smalldatetime)

insert @aaa
select 门店,营业单,商品1 as 商品,单价1 as 单价,折扣,审核人, 日期 from hahaha
union
select 门店,营业单,商品2 ,单价2,折扣2,null,null from hahaha
union
select 门店,营业单,商品3,单价3,折扣3,null ,null from hahaha

select 门店=case when isnull(门店,'')='' then null
else 门店 end ,营业单=case when isnull(营业单,'')='' then null else 营业单 end ,
商品,单价,折扣,审核人,日期 from @aaa
where 商品 is not null
--测试结果
门店 营业厅 商品 单价 折扣 审核人 日期
A 1 1 12.00 0.80 aa 2004-05-01 00:00:00
B 2 2 8.00 0.5 bb 2004-05-03 00:00:00
B 2 3 45.0000 0.90 NULL NULL
C 3 4 6.0000 0.90 cc 2004-06-01 00:00:00
C 3 4 22.0000 0.6 NULL NULL
C 3 5 33.0000 0.80 NULL NULL
D 6 3 45.0000 0.90 NULL NULL
D 6 6 10.0000 0.5 NULL NULL

hmily1688 2004-08-11
  • 打赏
  • 举报
回复
既然是MM我就写吧。
select a.* into #temp from (
select 门店,营业单,商品1 as 商品,单价1 as 单价,折扣,审核人, 日期 from hahaha
union
select 门店,营业单,商品2 ,单价2,折扣2,null,null from hahaha
union
select 门店,营业单,商品3,单价3,折扣3,null ,null from hahaha
) a

select case when isNull(审核人,'X')='X' then null
else 门店 end ,营业单,商品,单价,折扣,审核人,日期 from #temp where 商品 is not null
laker_tmj 2004-08-11
  • 打赏
  • 举报
回复
up
qulie 2004-08-11
  • 打赏
  • 举报
回复
各位战友们,伸出你们的援助之手啊,小妹急盼着你们的答复!
zjcxc(邹建)兄:盼你盼得好辛苦哦,快点帮帮我啊!
hmily1688 2004-08-11
  • 打赏
  • 举报
回复
你在syscolumns表中找字段吧
hmily1688 2004-08-11
  • 打赏
  • 举报
回复
这个问题能解决,得费时间,哈
qulie 2004-08-11
  • 打赏
  • 举报
回复
怎么没人回答?大家快来帮帮忙啊
hmily1688 2004-08-11
  • 打赏
  • 举报
回复
楼上的,你这样效率不高平白的给库中增加一个表,不如用表变量搞定效率高一些
lcq9732 2004-08-11
  • 打赏
  • 举报
回复
--构造数据
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = N't'
)
DROP TABLE t
create table t(门店 varchar(10),营业单 int,
审核人 varchar(10) not null,
日期 datetime,
商品1 int NULL,
单价1 decimal(6,2) null,折扣 decimal(6,2) null,
商品2 int NULL,
单价2 decimal(6,2) null,折扣2 decimal(6,2) null,
商品3 int NULL,
单价3 decimal(6,2) null,折扣3 decimal(6,2) null)

insert into t(门店,营业单,审核人,日期,商品1,单价1,折扣)
values('A',1,'aa','2004-5-1',1,12 ,0.8)
insert into t(门店,营业单,审核人,日期,商品1,单价1,折扣,商品2,单价2,折扣2)
values('B',2 ,'bb','2004-5-3',2,8,0.5,3,45,0.9)
insert into t(门店,营业单,审核人,日期,商品1,单价1,折扣,商品2,单价2,折扣2,商品3,单价3,折扣3)
values('C',3,'cc','2004-6-1',4,6,0.9,4,22,0.6,5,33,0.8)
insert into t(门店,营业单,审核人,日期,商品2,单价2,折扣2,商品3,单价3,折扣3)
values('D',6,'dd','2004-7-1',6,10,0.5,3,45,0.9)
--select * from t
--插入数据

IF EXISTS(SELECT name
FROM sysobjects
WHERE name = N'Tb'
)
DROP TABLE t
create table Tb(门店 varchar(10),营业单 int,商品 int NULL,
单价 decimal(6,2) null,折扣 decimal(6,2) null,
审核人 varchar(10) not null,
日期 datetime)

insert into Tb
select 门店,营业单,商品1,单价1,折扣,审核人,日期
from t where 商品1 is not null and 单价1 is not null and 折扣 is not null

insert into Tb
select 门店,营业单,商品2,单价2,折扣2,审核人,日期
from t where 商品2 is not null and 单价2 is not null and 折扣2 is not null

insert into Tb
select 门店,营业单,商品3,单价3,折扣3 ,审核人,日期
from t where 商品3 is not null and 单价3 is not null and 折扣3 is not null

select * from Tb order by 门店
--删除测试表
drop table t
drop table Tb

最后一个问题可以通过编程语言实现
hmily1688 2004-08-11
  • 打赏
  • 举报
回复
这个写的不通用,原来数据库的竹之草老斑主写过一个更通用的
id,name1,name2,name3,name4....最后变成

name1
name2
name3
name4
....
hmily1688 2004-08-11
  • 打赏
  • 举报
回复
不好意思,我写错了,最后用这句
select 门店=case when isnull(审核人,'')='' then null
else 门店 end ,营业单=case when isnull(审核人,'')='' then null else 营业单 end ,
商品,单价,折扣,审核人,日期 from @aaa
where 商品 is not null
hmily1688 2004-08-11
  • 打赏
  • 举报
回复
仔细看上面的语句我已经给你写明了。用这条
select 门店=case when isnull(门店,'')='' then null
else 门店 end ,营业单=case when isnull(营业单,'')='' then null else 营业单 end ,
商品,单价,折扣,审核人,日期 from @aaa
where 商品 is not null

34,575

社区成员

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

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