简单的竖表转横表问题 ( 积分: 100 )

  • 主题发起人 主题发起人 lucky_qiu
  • 开始时间 开始时间
L

lucky_qiu

Unregistered / Unconfirmed
GUEST, unregistred user!
原表:
单号 部门 编号 数量 金额
200702 市场部 A001 1 10
200702 人事部 A001 2 20
200702 设计部 A004 3 15
200702 电脑部 A006 4 20
200702 会计部 A006 5 25
200702 生产部 A001 3 15
200702 市场部 A002 6 60
200702 会计部 A006 1 5
...... ...... .... . ..

转成下表:
单号 编号 市场部数量 市场部金额 人事部数量 人事部金额 ...部数量..部金额 ...(省略)
200702 A001 1 10 2 20
200702 A002 6 60 0 0
200702 A004 0 0 0 0
200702 A006 0 0 0 0

请各位兄弟帮手搞搞
 
试过以下的可以完成,但没有通用性,如果要增加部门的话就要改程序了,
能不能做得通用些呢?
select tsim_no,tsim_gsno,
SUM(CASE tsim_bm WHEN '会计部' THEN tsim_qty ELSE 0 END) 会计部qty,
SUM(CASE tsim_bm WHEN '会计部' THEN tsim_money ELSE 0 END) 会计部money,
SUM(CASE tsim_bm WHEN '设计部' THEN tsim_qty ELSE 0 END) 设计部qty,
SUM(CASE tsim_bm WHEN '设计部' THEN tsim_money ELSE 0 END) 设计部money,
SUM(CASE tsim_bm WHEN '包装部' THEN tsim_qty ELSE 0 END) 包装部qty,
SUM(CASE tsim_bm WHEN '包装部' THEN tsim_money ELSE 0 END) 包装部money,
SUM(CASE tsim_bm WHEN '成品部' THEN tsim_qty ELSE 0 END) 成品部qty,
SUM(CASE tsim_bm WHEN '成品部' THEN tsim_money ELSE 0 END)成品部money,
SUM(CASE tsim_bm WHEN '倒模部' THEN tsim_qty ELSE 0 END) 倒模部qty,
SUM(CASE tsim_bm WHEN '倒模部' THEN tsim_money ELSE 0 END) 倒模部money,
SUM(CASE tsim_bm WHEN '电脑部' THEN tsim_qty ELSE 0 END) 电脑部qty,
SUM(CASE tsim_bm WHEN '电脑部' THEN tsim_money ELSE 0 END) 电脑部money,
SUM(CASE tsim_bm WHEN '市场部' THEN tsim_qty ELSE 0 END) 市场部qty,
SUM(CASE tsim_bm WHEN '市场部' THEN tsim_money ELSE 0 END) 市场部money
from tsinvitm group by tsim_no,tsim_gsno
 
有冇仁兄可以帮帮忙???!!!
 
select tsim_no,tsim_gsno,
SUM(CASE tsim_bm WHEN '会计部' THEN tsim_qty ELSE 0 END) 会计部qty,
SUM(CASE tsim_bm WHEN '会计部' THEN tsim_money ELSE 0 END) 会计部money,
SUM(CASE tsim_bm WHEN '设计部' THEN tsim_qty ELSE 0 END) 设计部qty,
SUM(CASE tsim_bm WHEN '设计部' THEN tsim_money ELSE 0 END) 设计部money,
SUM(CASE tsim_bm WHEN '包装部' THEN tsim_qty ELSE 0 END) 包装部qty,
SUM(CASE tsim_bm WHEN '包装部' THEN tsim_money ELSE 0 END) 包装部money,
SUM(CASE tsim_bm WHEN '成品部' THEN tsim_qty ELSE 0 END) 成品部qty,
SUM(CASE tsim_bm WHEN '成品部' THEN tsim_money ELSE 0 END)成品部money,
SUM(CASE tsim_bm WHEN '倒模部' THEN tsim_qty ELSE 0 END) 倒模部qty,
SUM(CASE tsim_bm WHEN '倒模部' THEN tsim_money ELSE 0 END) 倒模部money,
SUM(CASE tsim_bm WHEN '电脑部' THEN tsim_qty ELSE 0 END) 电脑部qty,
SUM(CASE tsim_bm WHEN '电脑部' THEN tsim_money ELSE 0 END) 电脑部money,
SUM(CASE tsim_bm WHEN '市场部' THEN tsim_qty ELSE 0 END) 市场部qty,
SUM(CASE tsim_bm WHEN '市场部' THEN tsim_money ELSE 0 END) 市场部money
from tsinvitm group by tsim_no,tsim_gsno

以上一段有程序自己生成.....

首先有 select 部门 from .......
然后再一条一条生成以上语句............

这样做虽然有点笨......但可以做到.......
 
只是这样做 如果 查询结束后
客户做了调整 将 市场部数量 市场部金额
这两列拖到了 所列的最后....
然后再查询 这两列就会 又跑到最前面两列了!!!
我也在问这样的问题...
请看....
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3663889

呵呵呵~~~咱们的问题类似.....
 
转置干吗?千万别干这样的事,效率极低,影响速度,而且像你说的,下次可能项目不一样,最好的办法是:
教给他们在EXCEL里面使用选择性粘贴的转置功能
 
如果可以用EXCEL的话,我还用做程吗?
我这是做在月结表中,要记录一个月各部门之间的物品交收和物品的出入情况,
由于部门有20多个,如果我做在同一个表的话,单是部门这一方面就要加40多个
字段,如果以后要增加部门的话就又要改结构和程序了,麻烦!
所以我部门交收做在另一个竖表,可以解决以后的部门增加问题....但...
转横表如果用我以上的SQL又不通用.....到时又要改SQL....
我想要的就是...........一劳永逸...........
 
写成存储过程就能一劳永逸 拉

--SQL SERVER 2000 的存储过程 你自己修改一下
Create procedure TestProc
as
begin
declare @SqlText varchar(8000), @TmpSql varchar(7000)
declare @TmpTable table(ID int identity(1,1), [month] int)
insert into @TmpTable([month]) select DISTINCT [month] from TbSalery order by [month]
declare @MID int, @MCount int, @MValue varchar(10)
select @MCount = count(1), @MID = 1 from @TmpTable
set @TmpSql = ''
while @MID <= @MCount
begin
select @MValue = [month] from @TmpTable where ID = @MID
if @MID <> @MCount
set @TmpSql = @TmpSql + 'sum(case when [month] = ' + @MValue + ' then Salery else 0 end) ' + '[' + @MValue + '] ' + ' ,' + char(13)
else
set @TmpSql = @TmpSql + 'sum(case when [month] = ' + @MValue + ' then Salery else 0 end) ' + '[' + @MValue + '] ' + char(13)

set @MID = @MID + 1
end
set @SqlText = 'select name, ' + char(13) + @TmpSql + char(13) + 'from TbSalery group by name'
--print @SqlText
exec(@SqlText)
end
 
我对存储过程还不太熟,要研究下!
 
多谢支持!!!最后还是决定不转横表了
因为太长,打印不了
 
后退
顶部