sql(124分)

  • 主题发起人 主题发起人 zlibo
  • 开始时间 开始时间
Z

zlibo

Unregistered / Unconfirmed
GUEST, unregistred user!
原始数据如下:


工序名称 类别 千件用工 单价
A 基本 3 3
A 剖幅 4 4
B 基本 5 5
B 剖幅 6 6

要求输出或打印格式如下:


工序名称 基本千件用工 基本单价 剖幅千件用工 剖幅单价
A 3 3 4 4
B 5 5 6 6


注:其中“类别”的个数不定,即除了“基本”和“剖幅”外还有其它类别
急,哪位大侠能帮帮忙,给个主意,或发邮件zlb@zhaoyuan.cn,所有分全部奉上
 
可以用decode 和 case 函数来处理
 
这位大侠,能不能详细一点,小弟水平不行,理解不透呀
 
你搜索一下sql的行列转换,应该很多的
 
select 段别 , 工序名称, (case when 类别='基本' then sum(千件用工) else 0 end) as 基本千件用工 , (case when 类别='剖幅' then avg(单价) else 0 end) as 基本单价, (case when 类别='部副' then sum(千件用工) else 0 end) as 剖幅千件用工, (case when 类别='部副' then avg(单价) else 0 end) as 剖幅单价
from yourtable

这是sql server的。。 如果是access 用iff 语句。
 
什么数据库?
 
sqlserver2000数据库
 
to duhai_lee:
按你所说得到的结果形式如下:
段别 工序名称 基本千件用工 基本单价 剖幅千件用工 剖幅单价
裁剪段 A 3 3 0 0
裁剪段 A 0 0 4 4
裁剪段 B 5 5 0 0
裁剪段 B 0 0 6 6

你看能不能实现我想要的结果,我看你的积分很高,你是高手,帮帮忙
 
在后面+
GROUP BY 段别, 工序名称
 
declare @a table(工序名称 varchar(50),类别 varchar(50),千件用工 numeric(8,2),单价 numeric(8,2))
insert @a select 'A','基本',3,3
union select 'A','剖幅',4,4
union select 'B','基本',5,5
union select 'B','剖幅',6,6
go

select 工序名称=A.工序名称,基本千件用工=A.千件用工,基本单价=A.单价,剖幅千件用工=B.千件用工,剖幅单价=B.单价 from
@a A inner join @a B on A.工序名称=B.工序名称 where A.类别='基本' and B.类别='剖幅' order by A.工序名称
 
“类别”个数是不确定的
 
晕你该题目了
原先说的是工序.

还有你的工序最多多少个?工序的名字是不是都一样的?
 
不好意思,我开始写的不完整
 
类别一共有多少种,还是用户随便输入的,如果类别的总数是确定的,但是每一道工序的类别可能只是部分的话那也可以用我上面写的那个,只是要多用几个left join 就行了.
 
回楼上的大侠:
是后者,即:类别的总数是确定的,但是每一道工序的类别可能只是部分
 
那好办了,你把总的告诉我,不是很多把,
 
共有五种,还有大码,小码,返裁
另外能不能不用存储过程,我不懂呀
 
declare @a table(工序名称 varchar(50),类别 varchar(50),千件用工 numeric(8,2),单价 numeric(8,2))
insert into @a select 'A','基本',3,3
union select 'A','剖幅',4,4
union select 'A','大码',9,9
union select 'B','基本',5,5
union select 'B','剖幅',6,6
union select 'B','小码',7,7

select 工序名称=A.工序名称,基本千件用工=A.千件用工,基本单价=A.单价,剖幅千件用工=B.千件用工,剖幅单价=B.单价,
大码千件用工=c.千件用工,大码单价=c.单价,小码千件用工=d.千件用工,小码单价=d.单价,返裁千件用工=e.千件用工,返裁单价=e.单价
from @a A
full outer join @a B on A.工序名称=B.工序名称 and B.类别='剖幅'
full outer join @a c on A.工序名称=c.工序名称 and c.类别='大码'
full outer join @a d on A.工序名称=d.工序名称 and d.类别='小码'
full outer join @a e on A.工序名称=e.工序名称 and e.类别='返裁'
where A.类别='基本' order by A.工序名称


可以用存储过程你只需要把上面的过程放在begin,end 里面就是了.
create procedure p_sta
as
begin
end

我上面的那种写法,没有加isnull的判断,你可以在显示的时候在判断.此外你要注意,
每到工序是不是都含有基本这个列别呢,如果是的话,那查询没有问题,如果不是的话,可能还要少一些记录.
 
回楼上:
看不太懂,再就是“工序名称”的总数是不定的,该怎么办?
 
那个不影响的.我写的那个查询符合你的结果不?
 
后退
顶部