交叉表求教!

老七 2007-05-28 05:11:18
数据如下:
FYear FPeriod 材料名称 数量 单价 成本
2007 1 葡萄糖 101 3.6 363.6
2007 2 葡萄糖 102 4.2 428.4
2007 3 葡萄糖 103 4.1 422.3
2007 4 葡萄糖 104 4.3 447.2
2007 1 收缩膜 101 4.1 414.1
2007 2 收缩膜 102 4.2 428.4
2007 1 丁基胶塞1 101 4.4 444.4
2007 2 丁基胶塞1 101 4.4 444.4
2007 2 丁基胶塞2 101 2.2 222.2
2007 3 丁基胶塞2 111 2.2 244.2
2007 4 丁基胶塞2 101 2.2 222.2
需求结果样式
材料名称 01数量 01单价 01成本 02数量 02单价 02成本 ...... 全年数量 全年单价 全年成本
葡萄糖 101 3.6 363.6 102 4.2 428.4 410 4.05 1661.5
收缩膜 .....
丁基胶塞 .....
丁基胶塞 .....

谢谢。
我上班才能到这里,请谅解。
...全文
586 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
老七 2007-06-20
  • 打赏
  • 举报
回复
几天没有来,终于见到回复了,下午测试一下。
老七 2007-06-20
  • 打赏
  • 举报
回复
终于等到高手 ,我明天一早测试一下我的实际需求,应该没问题了。
paoluo 2007-06-20
  • 打赏
  • 举报
回复
--如果順序真的那麼重要的話,借用下臨時表吧。

--創建測試環境
Create Table T(FYear Int, FPeriod Int, 材料名称 Nvarchar(20), 数量 Int, 单价 Numeric(20,6), 成本 Numeric(20,6))
--插入數據
Insert Into T(FYear, FPeriod, 材料名称, 数量, 单价, 成本)
Select 2007,1,N'葡萄糖', 101,3.6,363.6
Union All Select 2007,2,N'葡萄糖', 102,4.2,428.4
Union All Select 2007,9,N'葡萄糖', 102,4.2,428.4
Union All Select 2007,10,N'葡萄糖', 102,4.2,428.4
Union All Select 2007,12,N'葡萄糖', 102,4.2,428.4
Union All Select 2007,1,N'收缩膜', 101,4.1,414.1
Union All Select 2007,2,N'收缩膜', 102,4.2,428.4
Union All Select 2007,1,N'丁基胶塞1',101,4.4,444.4
Union All Select 2007,2,N'丁基胶塞1',101,4.4,444.4
Union All Select 2007,3,N'丁基胶塞1',101,4.4,444.4
GO
--測試
Select ID = Identity(Int, 1, 1), * Into #T From T

Declare @Max Int, @I Int, @S Nvarchar(4000)
Select @Max = 12, @I = 1, @S = N'Select 材料名称'
While @I <= @Max
Begin
Select @S=@S + ', SUM(Case FPeriod When ' + Cast(@I As Varchar) + N' Then 数量 Else 0 End) As [' + Right(100 + @I, 2) + N'数量]'
+ ', SUM(Case FPeriod When ' + Cast(@I As Varchar) + N' Then 单价 Else 0 End) As [' + Right(100 + @I, 2) + N'单价]'
+ ', SUM(Case FPeriod When ' + Cast(@I As Varchar) + N' Then 成本 Else 0 End) As [' + Right(100 + @I, 2) + N'成本]'
Select @I=@I+1
End
Select @S = @S+ N' , SUM(数量) As 全年数量, SUM(单价) As 全年单价, SUM(成本) As 全年成本 From #T Group By FYear, 材料名称 Order By Min(ID) '
EXEC(@S)
Drop Table #T
GO
--刪除測試環境
Drop Table T
sp4 2007-06-20
  • 打赏
  • 举报
回复
顺序那东西,可以先生成临时表然后连接查询就可以
sp4 2007-06-20
  • 打赏
  • 举报
回复
什么顺序啊》
老七 2007-06-20
  • 打赏
  • 举报
回复
同Yang_(扬帆破浪) 的答案一样,改变了数据顺序.
sp4 2007-06-15
  • 打赏
  • 举报
回复
要全年的话,直接就不用获取最的数值了,FPeriod是月么?如果是的话
Create Table Table_Pqs
(id Int identity(1,1),
FYear int default 2007,
FPeriod int,
name varchar(40),
num Int,
dj int,
cb int)

insert into Table_Pqs(fyear, FPeriod, name, num, dj , cb )
select 2007,1,'葡萄糖',1013,6363,6 union all
select 2007,2,'葡萄糖',1024,2428,4 union all
select 2007,3,'葡萄糖',1034,1422,3 union all
select 2007,4,'葡萄糖',1044,3447,2 union all
select 2007,1,'收缩膜',1014,1414,1 union all
select 2007,2,'收缩膜',1024,2428,4 union all
select 2007,1,'丁基胶塞',11014,4444,4 union all
select 2007,2,'丁基胶塞',11014,4444,4 union all
select 2007,2,'丁基胶塞',21012,2222,2 union all
select 2007,3,'丁基胶塞',21112,2244,2 union all
select 2007,4,'丁基胶塞',21012,2222,2


declare @max int,@i int
Declare @Sql Varchar(8000)
select @max=12
set @sql='select name as 材料名称'
set @i=1
while @i<=@max
begin
set @sql=@sql + ',sum(Case FPeriod When '+cast(@i as varchar)+' Then num Else 0 End) As ['+right('00'+cast(@i as varchar),2)+'数量]'
set @sql=@sql + ',sum(Case FPeriod When '+cast(@i as varchar)+' Then dj Else 0 End) As ['+right('00'+cast(@i as varchar),2)+'单价]'
set @sql=@sql + ',sum(Case FPeriod When '+cast(@i as varchar)+' Then cb Else 0 End) As ['+right('00'+cast(@i as varchar),2)+'成本]'
set @i=@i+1
end
select @sql = @sql+' from Table_Pqs Group By name '

exec(@sql)

drop table Table_Pqs
sp4 2007-06-15
  • 打赏
  • 举报
回复
查询结果

(11 行受影响)
材料名称 01数量 01单价 01成本 02数量 02单价 02成本 03数量 03单价 03成本 04数量 04单价 04成本
---------------------------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
丁基胶塞 11014 4444 4 32026 6666 6 21112 2244 2 21012 2222 2
葡萄糖 1013 6363 6 1024 2428 4 1034 1422 3 1044 3447 2
收缩膜 1014 1414 1 1024 2428 4 0 0 0 0 0 0

(3 行受影响)
sp4 2007-06-15
  • 打赏
  • 举报
回复
Create Table Table_Pqs
(id Int identity(1,1),
FYear int default 2007,
FPeriod int,
name varchar(40),
num Int,
dj int,
cb int)

insert into Table_Pqs(fyear, FPeriod, name, num, dj , cb )
select 2007,1,'葡萄糖',1013,6363,6 union all
select 2007,2,'葡萄糖',1024,2428,4 union all
select 2007,3,'葡萄糖',1034,1422,3 union all
select 2007,4,'葡萄糖',1044,3447,2 union all
select 2007,1,'收缩膜',1014,1414,1 union all
select 2007,2,'收缩膜',1024,2428,4 union all
select 2007,1,'丁基胶塞',11014,4444,4 union all
select 2007,2,'丁基胶塞',11014,4444,4 union all
select 2007,2,'丁基胶塞',21012,2222,2 union all
select 2007,3,'丁基胶塞',21112,2244,2 union all
select 2007,4,'丁基胶塞',21012,2222,2


declare @max int,@i int
Declare @Sql Varchar(8000)
select @max=FPeriod from Table_Pqs
set @sql='select name as 材料名称'
set @i=1
while @i<=@max
begin
set @sql=@sql + ',sum(Case FPeriod When '+cast(@i as varchar)+' Then num Else 0 End) As ['+right('00'+cast(@i as varchar),2)+'数量]'
set @sql=@sql + ',sum(Case FPeriod When '+cast(@i as varchar)+' Then dj Else 0 End) As ['+right('00'+cast(@i as varchar),2)+'单价]'
set @sql=@sql + ',sum(Case FPeriod When '+cast(@i as varchar)+' Then cb Else 0 End) As ['+right('00'+cast(@i as varchar),2)+'成本]'
set @i=@i+1
end
select @sql = @sql+' from Table_Pqs Group By name '

exec(@sql)

drop table Table_Pqs
老七 2007-06-15
  • 打赏
  • 举报
回复
盼望高手
老七 2007-06-08
  • 打赏
  • 举报
回复
?
老七 2007-06-04
  • 打赏
  • 举报
回复
Yang_(扬帆破浪) 的答案改变了数据顺序,我要求按原来的材料名称顺序按月展开,若有好的答案我会马上加分揭帖。
QuinsonYue 2007-06-03
  • 打赏
  • 举报
回复
这个问题实际应用还是比较多的 一般都是通过报表的设计功能来实现 没用sql语句实现过
值得关注.........
useresu 2007-06-02
  • 打赏
  • 举报
回复
借lz地盘问一下:我也有类似的需求,
select @sql=isnull(@sql,'')+'select 材料名称, '
select @sql=@sql+'max(case when FPeriod='+cast(a.FPeriod as varchar(20))+
' then 数量 else 0 end) as '''++cast(a.FPeriod as varchar(20))++'数量'',max(case when FPeriod='+cast(a.FPeriod as varchar(20))+
' then 单价 else 0 end) as'''+cast(a.FPeriod as varchar(20))+'单价'',max(case when FPeriod='+cast(a.FPeriod as varchar(20))+
' then 成本 else 0 end ) as '''+cast(a.FPeriod as varchar(20))+'成本'',' from (select FPeriod from @t ) as a
select @sql=substring(@sql,1,len(@sql)-1)

select @sql=@sql+' ,sum(成本) as ''全年成本'' from t group by 材料名称 '
这个基本满足我的要求,

但是这个语句除了在查询分析器中运行,

我想在应用程序中调用(delphi),如何使用呢?如何返回结果集到应用程序?
菜菜的问?
老七 2007-06-01
  • 打赏
  • 举报
回复
鑷繁椤朵竴涓嬨€
老七 2007-06-01
  • 打赏
  • 举报
回复
若有好的答案我会马上揭帖,再加分也可。
老七 2007-06-01
  • 打赏
  • 举报
回复
盼望高手, 星期一再来!
sunshine_zhang 2007-06-01
  • 打赏
  • 举报
回复
--我觉得,既需要返回结果,又要对返回的结果集进行报表制作或者操作什么的。。也可以考虑下这种思路,首先创建一个临时表,然后填充数据
declare @query varchar(200)
declare @monthIndex int
set @monthIndex = 1
create table #test
(
fYear int,
Period varchar(200)
)


--材料名称01数量01单价01成本02数量02单价02成本 ...... 全年数量全年单价全年成本
while (@monthIndex <= 12)
begin
set @query = 'alter table #test add 数量'+ right('0'+cast(@monthIndex as varchar),2) +' float '
exec(@query)
set @query = 'alter table #test add 单价'+ right('0'+cast(@monthIndex as varchar),2) +' float '
exec(@query)
set @query = 'alter table #test add 成本'+ right('0'+cast(@monthIndex as varchar),2) +' float '
exec(@query)
set @monthIndex = @monthIndex + 1
end

exec('alter table #test add 全年数量 float ')
exec('alter table #test add 全年单价 float ')
exec('alter table #test add 全年成本 float ')

select * from #test

然后可以用楼上几位的语句进行部分更改然后往临时表进行数据填充
老七 2007-05-31
  • 打赏
  • 举报
回复
盼望高手出现
stou 2007-05-30
  • 打赏
  • 举报
回复
加载更多回复(11)

34,593

社区成员

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

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