不确定兼容LITE,你参考下DECLARE @MinDate DATETIME,@MaxDate DATETIME SELECT @MinDate=MIN(CAST(CONVERT(VARCHAR(8),还款日期,111)+CAST(账单日 AS VARCHAR(10))AS DATETIME)) ,@MaxDate=MAX(CAST(CONVERT(VARCHAR(8),还款日期,111)+CAST(还款日 AS VARCHAR(10))AS DATETIME)) FROM 表名 PRINT @MinDate PRINT @MaxDate DECLARE @SQL VARCHAR(MAX) SET @SQL='' DECLARE @SQL2 VARCHAR(MAX) SET @SQL2='' SELECT @SQL=@SQL+',SUM(CASE WHEN CONVERT(VARCHAR(10),还款日期,111)='''+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111) +''' THEN 还款金额 END)['+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)+']' ,@SQL2=@SQL2+',NULL ['+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)+']' FROM master..spt_values WHERE type='P'AND number<=DATEDIFF(DAY,@MinDate,@MaxDate) SET @SQL='SELECT 姓名,卡号,还款类型[项目],SUM(还款金额)[合计]'+@SQL+',固定额度,1[A]FROM 表名 GROUP BY 姓名,卡号,还款类型,固定额度' +' UNION ALL ' +'SELECT 姓名,卡号,''固定额度'',固定额度'+@SQL2+',固定额度,2[A]FROM 表名 GROUP BY 姓名,卡号,固定额度' +' ORDER BY 姓名,固定额度 DESC,A' EXEC(@SQL)
DECLARE @MinDate DATETIME,@MaxDate DATETIME SELECT @MinDate=MIN(CAST(CONVERT(VARCHAR(8),还款日期,111)+CAST(账单日 AS VARCHAR(10))AS DATETIME)) ,@MaxDate=MAX(CAST(CONVERT(VARCHAR(8),还款日期,111)+CAST(还款日 AS VARCHAR(10))AS DATETIME)) FROM 表名 DECLARE @SQL VARCHAR(MAX) SET @SQL='' DECLARE @SQL2 VARCHAR(MAX) SET @SQL2='' SELECT @SQL=@SQL+',SUM(CASE WHEN CONVERT(VARCHAR(10),还款日期,111)='''+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111) +''' THEN 还款金额 END)['+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)+']' ,@SQL2=@SQL2+',NULL ['+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)+']' FROM master..spt_values WHERE type='P'AND number<=DATEDIFF(DAY,@MinDate,@MaxDate) SET @SQL='SELECT 姓名,卡号,还款类型[项目],SUM(还款金额)[合计]'+@SQL+',1[A]FROM 表名 GROUP BY 姓名,卡号,还款类型' +' UNION ALL ' +'SELECT 姓名,卡号,''固定额度'',固定额度'+@SQL2+',2[A]FROM 表名 GROUP BY 姓名,卡号,固定额度' +' ORDER BY 姓名,卡号,A' EXEC(@SQL)小调下
曾想过用水晶报表来做,但涉及到行列转换,所以还是想在数据库用sql语句来实现更靠谱一点。当然,有用水晶报表能实现的,请赐教。现在也不局限于兼容sqlite了。能用sql语句实现都行。饥不择食了
行列转换完全可以在程序中进行:
原始数据按姓名、卡号、类型、日期排序;
再新建一个DataTable,不定列按日期范围添加;
循环原始数据,添加到目标DataTable,结果就可以用报表来处理了。
其实也是行转列,对于空白的日期列,需要确保有一条数据,行转列出来才能达到效果
可以在程序上处理,也可以在SQL上处理
话说,那些账单日,还款日的年月怎么确定,有可能跨月吗
你说这个跨月情况,暂时不考虑。考虑的话,那更麻烦了。有SQL语能实现的话,麻烦给我一些提示或一个大概的实现。
你说这个跨月情况,暂时不考虑。考虑的话,那更麻烦了。有SQL语能实现的话,麻烦给我一些提示或一个大概的实现。你这个只是动态行转列处理了,先找出最大最小日期,然后从最小日期行转列到最大日期,就可以了
SELECT @MinDate=MIN(CAST(CONVERT(VARCHAR(8),还款日期,111)+CAST(账单日 AS VARCHAR(10))AS DATETIME))
,@MaxDate=MAX(CAST(CONVERT(VARCHAR(8),还款日期,111)+CAST(还款日 AS VARCHAR(10))AS DATETIME))
FROM 表名
PRINT @MinDate
PRINT @MaxDate
DECLARE @SQL VARCHAR(MAX)
SET @SQL=''
DECLARE @SQL2 VARCHAR(MAX)
SET @SQL2=''
SELECT @SQL=@SQL+',SUM(CASE WHEN CONVERT(VARCHAR(10),还款日期,111)='''+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)
+''' THEN 还款金额 END)['+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)+']'
,@SQL2=@SQL2+',NULL ['+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)+']'
FROM master..spt_values
WHERE type='P'AND number<=DATEDIFF(DAY,@MinDate,@MaxDate)
SET @SQL='SELECT 姓名,卡号,还款类型[项目],SUM(还款金额)[合计]'+@SQL+',固定额度,1[A]FROM 表名 GROUP BY 姓名,卡号,还款类型,固定额度'
+' UNION ALL '
+'SELECT 姓名,卡号,''固定额度'',固定额度'+@SQL2+',固定额度,2[A]FROM 表名 GROUP BY 姓名,卡号,固定额度'
+' ORDER BY 姓名,固定额度 DESC,A'
EXEC(@SQL)
SELECT @MinDate=MIN(CAST(CONVERT(VARCHAR(8),还款日期,111)+CAST(账单日 AS VARCHAR(10))AS DATETIME))
,@MaxDate=MAX(CAST(CONVERT(VARCHAR(8),还款日期,111)+CAST(还款日 AS VARCHAR(10))AS DATETIME))
FROM 表名
DECLARE @SQL VARCHAR(MAX)
SET @SQL=''
DECLARE @SQL2 VARCHAR(MAX)
SET @SQL2=''
SELECT @SQL=@SQL+',SUM(CASE WHEN CONVERT(VARCHAR(10),还款日期,111)='''+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)
+''' THEN 还款金额 END)['+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)+']'
,@SQL2=@SQL2+',NULL ['+CONVERT(VARCHAR(10),DATEADD(DAY,number,@MinDate),111)+']'
FROM master..spt_values
WHERE type='P'AND number<=DATEDIFF(DAY,@MinDate,@MaxDate)
SET @SQL='SELECT 姓名,卡号,还款类型[项目],SUM(还款金额)[合计]'+@SQL+',1[A]FROM 表名 GROUP BY 姓名,卡号,还款类型'
+' UNION ALL '
+'SELECT 姓名,卡号,''固定额度'',固定额度'+@SQL2+',2[A]FROM 表名 GROUP BY 姓名,卡号,固定额度'
+' ORDER BY 姓名,卡号,A'
EXEC(@SQL)小调下