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

刚刚得到解决的交叉表问题,自己加了日期范围条件,报错从字符串转换为datetime 时发生语法错误
ALTER   PROCEDURE   存储过程9
(
@begin   datetime,@end   datetime
)
AS
DECLARE   @s   varchar(8000)
SET   @s=   ' '
SELECT   @s=@s
+ ', '+QUOTENAME(费用名称)
+ '=SUM(CASE   费用名称   WHEN   '+QUOTENAME(费用名称, ' ' ' ')
+ '   THEN   金额   ELSE   0   END) '
FROM   sz_vi所有收支   where   (日期   BETWEEN   ' ' '+convert(char(10),@begin,120)+ ' ' '   AND   ' ' '+convert(char(10),@end,120)   + ' ' ')              
                  GROUP   BY   费用名称
SELECT   @s=@s
+ '
,   SUM(CASE   方向   WHEN   ' '收入 ' '   THEN   金额   ELSE   0   END)   As   收入
,   SUM(CASE   方向   WHEN   ' '支出 ' '   THEN   金额   ELSE   0   END)   As   支出
,   SUM(CASE   方向   WHEN   ' '收入 ' '   THEN   金额   WHEN   ' '支出 ' '   THEN   -   金额   ELSE   0   END)   As   结余
FROM   sz_vi所有收支   where   (日期   BETWEEN   ' ' '+convert(char(10),@begin,120)+ ' ' '   AND   ' ' '+convert(char(10),@end,120)   + ' ' ') '
EXEC( 'SELECT   Convert(Varchar(10),   日期,   120)   As   日期 '   +   @s+   '   GROUP   BY   日期 '   +   '   Union   All   '   +   'SELECT   ' '合计 ' ' '   +   @s)  


------解决方案--------------------
ALTER PROCEDURE 存储过程9
(
@begin datetime,@end datetime
)
AS
DECLARE @s varchar(8000)
SET @s= ' '
SELECT @s=@s
+ ', '+QUOTENAME(费用名称)
+ '=SUM(CASE 费用名称 WHEN '+QUOTENAME(费用名称, ' ' ' ')
+ ' THEN 金额 ELSE 0 END) '
FROM sz_vi所有收支 where 日期 BETWEEN @begin AND @end --这样就可以
GROUP BY 费用名称
SELECT @s=@s
+ '
, SUM(CASE 方向 WHEN ' '收入 ' ' THEN 金额 ELSE 0 END) As 收入
, SUM(CASE 方向 WHEN ' '支出 ' ' THEN 金额 ELSE 0 END) As 支出
, SUM(CASE 方向 WHEN ' '收入 ' ' THEN 金额 WHEN ' '支出 ' ' THEN - 金额 ELSE 0 END) As 结余
FROM sz_vi所有收支 where (日期 BETWEEN ' ' '+convert(char(10),@begin,120)+ ' ' ' AND ' ' '+convert(char(10),@end,120) + ' ' ') '
EXEC( 'SELECT Convert(Varchar(10), 日期, 120) As 日期 ' + @s+ ' GROUP BY 日期 ' + ' Union All ' + 'SELECT ' '合计 ' ' ' + @s)


------解决方案--------------------
其实你的代码只要是如下就行了.不需要转换
日期 BETWEEN @begin AND @end
------解决方案--------------------
再修改下

ALTER PROCEDURE 存储过程9
(
@begin datetime,@end datetime
)
AS
DECLARE @s varchar(8000)
SET @s= ' '
SELECT @s=@s
+ ', '+QUOTENAME(费用名称)
+ '=SUM(CASE 费用名称 WHEN '+QUOTENAME(费用名称, ' ' ' ')
+ ' THEN 金额 ELSE 0 END) '
FROM sz_vi所有收支 where (日期 BETWEEN @begin AND @end) --只有這一處修改
GROUP BY 费用名称
SELECT @s=@s
+ '
, SUM(CASE 方向