难,高手请进来指导,菜鸟进来学习!100分

atlcat 2005-03-18 09:34:51
表:
编号 大类 小类 型号 数量 单价 单位
0001 有价卡 充值卡 50元 300 1.25 伟达
0002 有价卡 充值卡 100元 80 1.5 伟达
0002 有价卡 充值卡 100元 300 1.5 通大
0002 有价卡 充值卡 100元 100 1.5 通大
0001 有价卡 充值卡 50元 100 1.25 通大
要得到的结果:
单位 数量1 单价1 数量2 单价2
通大 100 1.25 400 1.5
伟达 300 1.25 80 1.5

其中编号和单位字段数量不定,也就是说,查出来的结果行和列都是根据实际情况变化的
...全文
174 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wumylove1234 2005-03-19
我的妈亲呢!
不管邹大侠的对否,他的这种方法我是从未见过的!!!!!!!
太让我感慨了~我还感觉自已SQL学的够可以的了,差太多了,无地自容!
回复
zjcxc 元老 2005-03-19
晕,你直接说明不就行了么,绕这么大圈子干嘛?

你自己测试了数据,帖出了结果,我没发现生成的结果有错,你发现有错就指明
回复
atlcat 2005-03-19
你把数据变为我的样子看看就知道了
回复
zjcxc 元老 2005-03-19
我的结果没错啊,错在那了?
回复
lishengyu 2005-03-19
create table tb(编号 char(4),大类 varchar(10),小类 varchar(10),型号 varchar(10),数量 int,单价 decimal(10,2),单位 varchar(10))
insert tb select '0001','有价卡','充值卡','50元' ,300,1.25,'伟达'
union all select '0002','有价卡','充值卡','100元',80 ,1.5 ,'伟达'
union all select '0002','有价卡','充值卡','100元',300,1.5 ,'通大'
union all select '0002','有价卡','充值卡','100元',100,1.5 ,'通大'
union all select '0001','有价卡','充值卡','50元' ,100,1.25,'通大'
go

--查询处理
declare @s varchar(8000),@i as int
set @s=''
set @i=0
select
@i=@i+1,

@s=@s+','+cast(单价 as varchar)+' 单价'+cast(@i as varchar)+', sum (case when 单价='
+cast(单价 as varchar)+ ' then 数量 end) 数量' + cast (@i as varchar)

from tb group by 单价
set @s='select 单位 '+@s+' from tb group by 单位'
exec (@s)
--删除测试
drop table tb

单位 单价1 数量1 单价2 数量2
---------- ----- ----------- ----- -----------
通大 1.25 100 1.50 400
伟达 1.25 300 1.50 80
回复
atlcat 2005-03-18
我自己的方法,只能得到这个样子,如下:请指教:
declare @sql varchar(8000)
declare @s varchar(8000)
declare @s1 varchar(8000)
set @sql=''
set @sql='select 单位'
select @sql=@sql+',['+编号+']=(case 编号 when '''+编号+''' then 数量 else 0 end)'
from (select distinct 编号 from tradesman_view) a
set @sql=@sql+'from tb'
set @s='select 单位'
select @s=@s+',sum(['+编号+']) as ['+编号+']'
from (select distinct 编号 from tb) a
set @s=@s+'from ('+@sql+')b group by 单位'
exec(@s)
结果:
单位 0001 0002 0004
天音 0 0 100
通大 100 400 0
伟达 300 80 200

回复
atlcat 2005-03-18
高人,当我的数据变为:
编号 大类 小类 型号 数量 单价 名称
0001 有价卡 充值卡 50元 300 1.25 伟达
0002 有价卡 充值卡 100元 80 1.5 伟达
0002 有价卡 充值卡 100元 100 1.5 通大
0001 有价卡 充值卡 50元 100 1.25 通大
0002 有价卡 充值卡 100元 300 1.5 通大
0004 有价卡 天府卡 100元 200 1.75 伟达
0004 有价卡 天府卡 100元 100 1.75 天音
后,用您的方法好象有点问题:
结果如下:
名称 数量1 单价1 数量2 单价2 数量3 单价3
天音 100 1.75 0 0.0 0 0.0
通大 100 1.25 400 1.5 0 0.0
伟达 300 1.25 80 1.5 200 1.75
回复
atlcat 2005-03-18
邹兄,I服了U!!
我研究研究先
回复
zjcxc 元老 2005-03-18
--测试数据

create table tb(编号 char(4),大类 varchar(10),小类 varchar(10),型号 varchar(10),数量 int,单价 decimal(10,2),单位 varchar(10))
insert tb select '0001','有价卡','充值卡','50元' ,300,1.25,'伟达'
union all select '0002','有价卡','充值卡','100元',80 ,1.5 ,'伟达'
union all select '0002','有价卡','充值卡','100元',300,1.5 ,'通大'
union all select '0002','有价卡','充值卡','100元',100,1.5 ,'通大'
union all select '0001','有价卡','充值卡','50元' ,100,1.25,'通大'
go

--查询处理
declare @s nvarchar(4000),@i varchar(10)
select @s='',@i=max(cnt)
from(select 单位,cnt=count(distinct 编号) from tb group by 单位)a
while @i>0
select @s=',数量'+@i+'=isnull(sum(case id when '+@i+' then 数量 end),0)'
+',单价'+@i+'=isnull(max(case id when '+@i+' then 单价 end),0)'
+@s
,@i=@i-1
exec('select 单位'+@s+'
from(
select 单位,数量,单价,id=(select count(distinct 编号) from tb where 单位=aa.单位 and 编号<=aa.编号)
from tb aa
)a group by 单位')
go

--删除测试
drop table tb

/*--结果

单位 数量1 单价1 数量2 单价2
---------- ----------- ------------ ----------- ------------
通大 100 1.25 400 1.50
伟达 300 1.25 80 1.50
--*/
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2005-03-18 09:34
社区公告
暂无公告