好久没有提问了,今天问一问题:求一三维行列转换的SQL语句,请各位来捧捧场(在线等到今晚8点)

leongwong 2006-07-12 07:21:46
数据表如下:

部门 费用类型 数目
生产 材料费用 150
人力 人工费用 260
生产 机械费用 330
财务 其他费用 400

注:此表的数据是变化,且动态的

如何将行列字段转换成:

部门 材料费用 人工费用 机械费用 其他费用
生产 150 0 330 0
人力 0 260 0 0
财务 0 0 0 400

在线等到今晚8点!

...全文
295 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
leongwong 2006-07-13
  • 打赏
  • 举报
回复
感谢!昨晚没有把我的意思解释清楚!
是这样的:
部门 费用类型 数目
生产 材料费用 150
人力 人工费用 260
生产 机械费用 330
财务 其他费用 400

其中有另外两个表: “部门表”中存放了所有的部门,“费用类型表”中存放了所有的费用类型!以上的结果集中只有一部分的部门和一部份的费用类型,在邹老大给的语句中:
DECLARE @s nvarchar(4000)
SET @s = N''
SELECT @s = @s
+ N',' + QUOTENAME(费用类型) + N'= SUM(CASE 费用类型 WHEN N'
+ QUOTENAME(费用类型, N'''') + N' THEN 数目 ELSE 0 END)'
FROM(
SELECT DISTINCT 费用类型 FROM 数据表
)A
EXEC(N'
SELECT 部门 '+ @s + N'
FROM 数据表
GROUP BY 部门')

我将 FROM(SELECT DISTINCT 费用类型 FROM 数据表)A 改写成了FROM(SELECT DISTINCT 费用类型 FROM 费用类型表)A,这样就取出了所有的费用类型作为了列名,但此结果中的部门行,只是结果集中的一部分“部门”,能否也从“部门表”中取出所有部门参与行中!
hellowork 2006-07-13
  • 打赏
  • 举报
回复
那就需要与部门表进行表连接,对部门表中的所有部门进行费用汇总.类似这样:
select 部门表.部门, ----使用部门表中的部门,而不使用数据表中的部门
材料费用 = sum(case 数据表.费用类型 when '材料费用' then 数目 else 0 end),
人工费用 = sum(case 数据表.费用类型 when '人工费用' then 数目 else 0 end),
......
from 部门表.部门 left join 数据表.部门 on 部门表.部门 = 数据表.部门
group by 部门表.部门 ----对部门表中的所有部门分组
完整的字符串为:
exec(N'SELECT a.部门' + @s + N' FROM 部门表 a left join 数据表 on a.部门=数据表.部门 group by a.部门')
leongwong 2006-07-12
  • 打赏
  • 举报
回复
如果“部门”列和“费用类型”列,都不确定的话,如何用动态语句来实现?
leongwong 2006-07-12
  • 打赏
  • 举报
回复
OK,结贴了!感谢zjcxc(邹建) ,感谢hellowork(),感谢fcuandy(要学的东西还很多),改日开贴再谢!
fcuandy 2006-07-12
  • 打赏
  • 举报
回复
刚洗完澡,也来回一贴。
看楼主的要求,列应该是固定的。
SELECT 部门,
材料费用=SUM(ISNUMERIC(ISNULL(NULLIF(费用类型,'材料费用'),0))*数目),
人工费用=SUM(ISNUMERIC(ISNULL(NULLIF(费用类型,'人工费用'),0))*数目),
机械费用=SUM(ISNUMERIC(ISNULL(NULLIF(费用类型,'机械费用'),0))*数目),
其他费用=SUM(ISNUMERIC(ISNULL(NULLIF(费用类型,'其他费用'),0))*数目)
FROM 数据表
GROUP BY 部门

不固定的有人写了,我就不写了。
leongwong 2006-07-12
  • 打赏
  • 举报
回复
大鱼终于出现了,感谢楼上的,试试先!
zjcxc 元老 2006-07-12
  • 打赏
  • 举报
回复
-- 费用类型不确定的话, 则用动态语句
DECLARE @s nvarchar(4000)
SET @s = N''
SELECT @s = @s
+ N',' + QUOTENAME(费用类型) + N'= SUM(CASE 费用类型 WHEN N'
+ QUOTENAME(费用类型, N'''') + N' THEN 数目 ELSE 0 END)'
FROM(
SELECT DISTINCT 费用类型 FROM 数据表
)A
EXEC(N'
SELECT 部门 '+ @s + N'
FROM 数据表
GROUP BY 部门')
hellowork 2006-07-12
  • 打赏
  • 举报
回复
if object_id('test') is not null
drop table test
----创建测试数据
create table test(部门 varchar(50),费用类型 varchar(50),数目 int)
insert test
select '生产','材料费用',150 union all
select '人力','人工费用',260 union all
select '生产','机械费用',330 union all
select '财务','其他费用',400
--select * from @t
DECLARE @str VARCHAR(2000)
SET @str=''
SELECT @str=@str+','+费用类型+'=sum(case when 费用类型='''+费用类型+''' then '+cast(数目 as varchar(10))+' else 0 end)' FROM test
SET @str='SELECT 部门'+@str+' FROM test group by 部门 order by 部门 desc'
--print @str
EXEC(@str)
----清除测试数据
drop table test
zjcxc 元老 2006-07-12
  • 打赏
  • 举报
回复
--2005有直接的pivot
SELECT *
FROM 数据表
PIVOT(
SUM(数目)
FOR 费用类型 IN([材料费用], [人工费用], [机械费用], [其他费用])
)P
zjcxc 元老 2006-07-12
  • 打赏
  • 举报
回复
SELECT 部门,
材料费用 = SUM(CASE 费用类型 WHEN N'材料费用' THEN 数目 ELSE 0 END),
人工费用 = SUM(CASE 费用类型 WHEN N'人工费用' THEN 数目 ELSE 0 END),
机械费用 = SUM(CASE 费用类型 WHEN N'机械费用' THEN 数目 ELSE 0 END),
其他费用 = SUM(CASE 费用类型 WHEN N'其他费用' THEN 数目 ELSE 0 END)
FROM 数据表
GROUP BY 部门
leongwong 2006-07-12
  • 打赏
  • 举报
回复
UP一下!
leongwong 2006-07-12
  • 打赏
  • 举报
回复

部门 材料费用 人工费用 机械费用 其他费用
生产 150 0 330 0
人力 0 260 0 0
财务 0 0 0 400

在线等到今晚8点!

34,588

社区成员

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

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