日期:2014-05-19  浏览次数:20632 次

一个交叉表的问题请教
有一表:
序号 方向 费用名称                     金额 日期
1 收入 系统维修收入 ¥90.00 2006-09-08
7 支出 机床支出                   ¥89.00 2007-03-11

我用下面的语句:
ALTER   PROCEDURE   存储过程1
AS
--查询处理
DECLARE   @s   varchar(8000)
--交叉报表处理代码头
SET   @s= 'SELECT   日期 '
--生成列记录水平显示的处理代码拼接(处理Item列)
SELECT   @s=@s
+ ', '+QUOTENAME(费用名称)
+ '=SUM(CASE   费用名称   WHEN   '+QUOTENAME(费用名称, ' ' ' ')
+ '   THEN   金额   END) '
FROM   sz_vi所有收支
GROUP   BY   费用名称
SELECT   @s=@s
+ ', '+QUOTENAME(方向)  
+N '=SUM(CASE   方向   WHEN   '+QUOTENAME(方向,N ' ' ' ')
+N '   THEN   金额   END) '
FROM   sz_vi所有收支
GROUP   BY   方向
--拼接交叉报表处理尾部,并且执行拼接后的动态SQL语句
EXEC(@s+ '
FROM   sz_vi所有收支
GROUP   BY   日期 ')

出下面的果:
日期         机床支出 系统维修收入     收入           支出
2006-09-08                                   ¥90.00           ¥90.00
2007-03-11         ¥89.00         ¥89.00

但我想要的效果是:
日期         机床支出 系统维修收入     总收入           总支出       结余
2006-09-08                                   ¥90.00           ¥90.00               ¥90
2007-03-11         ¥89.00             ¥89.00       ¥89
合计:                     ¥89.00           ¥90.00                 ¥90             ¥89.00       ¥1.00
上面的语句应如何修改!谢谢!




------解决方案--------------------
ALTER
PROCEDURE 存储过程1
AS
--查询处理
DECLARE @s varchar(8000)


--交叉报表处理代码头
SET @s= 'SELECT 日期 '

--生成列记录水平显示的处理代码拼接(处理Item列)
SELECT @s=@s
+ ', '+QUOTENAME(费用名称)
+ '=SUM(CASE 费用名称 WHEN '+QUOTENAME(费用名称, ' ' ' ')
+ ' THEN 金额 END) '
FROM sz_vi所有收支
GROUP BY 费用名称
SELECT @s=@s
+ ', '+QUOTENAME(方向)
+N '=SUM(CASE 方向 WHEN '+QUOTENAME(方向,N ' ' ' ')
+N ' THEN 金额 END) '
FROM sz_vi所有收支
GROUP BY 方向

--print @s+ ' INTO tmp_table_abcd FROM sz_vi所有收支 GROUP BY 日期 '

--拼接交叉报表处理尾部,并且执行拼接后的动态SQL语句
EXEC(@s+ ' INTO tmp_table_abcd FROM sz_vi所有收支 GROUP BY 日期 ')

SELECT @S = '
SELECT *, 结余= 收入-支出 FROM tmp_table_abcd
union all
SELECT 日期 = ' '合计 ' ', '

SELECT @S=@S + 'sum( ' + name + ') '+ ', ' from syscolumns
where id=(select top 1 id from sysobjects where name= 'tmp_table_abcd ' and xtype= 'U ') AND XTYPE=108

SELECT @S = @s + ' SUM(结余) from ( SELECT *, 结余= 收入-支出 FROM tmp_table_abcd) A '