一直都在求类似需求的sql,但都没有很好的解决。行转列、列转行!!!!

解决方案 »

  1.   

    你都用sqlite了,想必应该有外部程序,为何不放到外部程序处理
      

  2.   

    就想出一个截图所示的报表,说明一下:程序是winform+sqlite 的一个业务程序。所以才说兼容sqlite数据库的语句更好。不知道你说的外部程序怎么处理。请给我一个解决问题的方向。
      

  3.   

    曾想过用水晶报表来做,但涉及到转列转换,所以还是想在数据库用sql语句来实现更靠谱一点。当然,有用水晶报表能实现的,请赐教。现在也不局限于兼容sqlite了。能用sql语句实现都行。饥不择食了。
      

  4.   

    上面的回复打错字了:
    曾想过用水晶报表来做,但涉及到行列转换,所以还是想在数据库用sql语句来实现更靠谱一点。当然,有用水晶报表能实现的,请赐教。现在也不局限于兼容sqlite了。能用sql语句实现都行。饥不择食了
      

  5.   

    winform就是外部程序,你让我做,我肯定会抽出需要数据,按人名,日期排好序,然后由winform程序来处理报表
      

  6.   

    这种稀疏的数据用SQL不划算。
    行列转换完全可以在程序中进行:
    原始数据按姓名、卡号、类型、日期排序;
    再新建一个DataTable,不定列按日期范围添加;
    循环原始数据,添加到目标DataTable,结果就可以用报表来处理了。
      

  7.   

    以前做FASTREPORT,也是实现过这种类似的,那是交叉报表
    其实也是行转列,对于空白的日期列,需要确保有一条数据,行转列出来才能达到效果
    可以在程序上处理,也可以在SQL上处理
    话说,那些账单日,还款日的年月怎么确定,有可能跨月吗
      

  8.   


    你说这个跨月情况,暂时不考虑。考虑的话,那更麻烦了。有SQL语能实现的话,麻烦给我一些提示或一个大概的实现。
      

  9.   


    你说这个跨月情况,暂时不考虑。考虑的话,那更麻烦了。有SQL语能实现的话,麻烦给我一些提示或一个大概的实现。你这个只是动态行转列处理了,先找出最大最小日期,然后从最小日期行转列到最大日期,就可以了
      

  10.   

    不确定兼容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)
      

  11.   

    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)小调下