目标表结构如下:
SysID      主键,自增identity(1,1)
CompanyID  外键,公司ID
ReportName 报表名称
Position   位置信息(类似excel中的a1这种格式)
Period     期间(如201010,为年份+月份)
Data       数值,money类型需求:
创建存储过程  输入参数@para1  ,@para2,输出参数 @para3 output
注:
 @para1 的结构为 '公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间'
 即 各列用.分隔而多个对象用,分隔的字符串
 @para2 结构同 @para1
返回
 @para3 = (@para1 里所有Data的和) - (@para1 里所有Data的和)请各位高手指点,在线等!

解决方案 »

  1.   

    补充示例
    如:
    declare @para3 money
    exec procName 
    '1.资产负债表.11.201010,1.利润表.13.201010,2.资产负债表.11.201010,2.利润表.201010',
    '4.资产负债表.11.201010,4.利润表.13.201010,5.资产负债表.11.201010,5.利润表.201010',
    @para3 output
      

  2.   

    SORRY,只要把DATA列加起来就行了是吧
      

  3.   


    可以这么说。
    就是@para1 里所有的data 减去 @para2 里所有data 
      

  4.   

    需求:
    创建存储过程  输入参数@para1  ,@para2,输出参数 @para3 output
    注:
     @para1 的结构为 '公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间'
     即 各列用.分隔而多个对象用,分隔的字符串
     @para2 结构同 @para1
    返回
     @para3 = (@para1 里所有Data的和) - (@para2 里所有Data的和)更正下,刚手误!
      

  5.   

    你给的数据里,无法根据位置确定哪部分是DATA
      

  6.   


    同一公司,同一报表,同一位置,同一期间的记录只有一条。
    另外,我能不能把参数换下,
    declare @para3 money
    exec procName 
    '1.资产负债表.11.2010.10,1.利润表.13.2010.10,2.资产负债表.11.2010.10,2.利润表.2010.10',
    '4.资产负债表.11.2010.10,4.利润表.13.2010.10,5.资产负债表.11.2010.10,5.利润表.2010.10',
    @para3 output
    注:
     @para1 的结构为 '公司ID.报表名称.位置.年.月,公司ID.报表名称.位置.年.月,公司ID.报表名称.位置.年.月'
     即 各列用.分隔而多个对象用,分隔的字符串
     @para2 结构同 @para1即:
    条件里的  期间  换成 年.月 而数据表里 期间 仍然为 年+月 ,就是 年*100+月
      

  7.   

    你好,你说的所有data的和,是指的这组数据的日期和么?
      

  8.   

    --建议修改下条件
    create proc proc_name
    @para1 nvarchar(max),
    @para2 nvarchar(max),
    @para3 int output
    as
      begin
         declare @s nvarchar(max)
         set @s='select @para3=sum(Data) from(
                 select Data from tb where '+@para1 + 'union all
                 select -Data from tb where '+@para2+')t '
         exec sp_executesql @s,N'@para3 int output',@para3 output
                            
      end 
      

  9.   

    我的@para1 这样写 ( companyid=1 and period=201010 ...) or (...) or (...)这样还有性能可言没?
      

  10.   

    参考:/*
    标题:分解字符串并查询相关数据
    作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 
    时间:2008-03-18
    地点:广东深圳
    说明:通过使用函数等方法分解字符串查询相关数据。问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。
    例如 @str = '1,2,3',查询下表得到记录1,4,5,6
    ID TypeID
    1  1,2,3,4,5,6,7,8,9,10,11,12
    2  2,3 
    3  3,7,8,9 
    4  2,6 
    5  4,5
    6  6,7 
    */
    -----------------------------
    create table tb (ID int , TypeID varchar(30)) 
    insert into tb values(1 , '1,2,3,4,5,6,7,8,9,10,11,12') 
    insert into tb values(2 , '2,3') 
    insert into tb values(3 , '3,7,8,9') 
    insert into tb values(4 , '2,6') 
    insert into tb values(5 , '4,5')
    insert into tb values(6 , '6,7')
    go
    -----------------------------
    --如果仅仅是一个,如@str = '1'.
    declare @str as varchar(30)
    set @str = '1'
    select * from tb where charindex(',' + @str + ',' , ',' + TypeID + ',') > 0
    select * from tb where ',' + TypeID + ',' like '%,' + @str + ',%'
    /*
    ID          TypeID                         
    ----------- ------------------------------ 
    1           1,2,3,4,5,6,7,8,9,10,11,12
    (所影响的行数为 1 行)
    */-----------------------------
    --如果包含两个,如@str = '1,2'.
    declare @str as varchar(30)
    set @str = '1,2'
    select * from tb where charindex(',' + left(@str , charindex(',' , @str) - 1) + ',' , ',' + typeid + ',') > 0 or 
      charindex(',' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',' , ',' + typeid + ',') > 0
    select * from tb where ',' + typeid + ',' like '%,' + left(@str , charindex(',' , @str) - 1) + ',%' or 
      ',' + typeid + ',' like '%,' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',%'
    /*
    ID          TypeID                         
    ----------- ------------------------------ 
    1           1,2,3,4,5,6,7,8,9,10,11,12
    2           2,3
    4           2,6
    (所影响的行数为 3 行)
    */-------------------------------------------
    --如果包含三个或四个,用PARSENAME函数来处理.
    declare @str as varchar(30)
    set @str = '1,2,3,4'
    select * from tb where 
      charindex(',' + parsename(replace(@str , ',' , '.') , 4) + ',' , ',' + typeid + ',') > 0 or
      charindex(',' + parsename(replace(@str , ',' , '.') , 3) + ',' , ',' + typeid + ',') > 0 or
      charindex(',' + parsename(replace(@str , ',' , '.') , 2) + ',' , ',' + typeid + ',') > 0 or
      charindex(',' + parsename(replace(@str , ',' , '.') , 1) + ',' , ',' + typeid + ',') > 0 
    select * from tb where 
      ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 4) + ',%' or
      ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 3) + ',%' or
      ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 2) + ',%' or
      ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 1) + ',%'
    /*
    ID          TypeID                         
    ----------- ------------------------------ 
    1           1,2,3,4,5,6,7,8,9,10,11,12
    2           2,3
    3           3,7,8,9
    4           2,6
    5           4,5
    (所影响的行数为 5 行)
    */---------------------------------------
    --如果超过四个,则只能使用函数或动态SQL来分解并查询数据。
    /*
    名称:fn_split函数.
    功能:实现字符串分隔功能的函数
    */
    create function dbo.fn_split(@inputstr varchar(8000), @seprator varchar(10))
    returns @temp table (a varchar(200))
    as 
    begin
      declare @i int
      set @inputstr = rtrim(ltrim(@inputstr))
      set @i = charindex(@seprator , @inputstr)
      while @i >= 1
      begin
        insert @temp values(left(@inputstr , @i - 1))
        set @inputstr = substring(@inputstr , @i + 1 , len(@inputstr) - @i)
        set @i = charindex(@seprator , @inputstr)
      end
      if @inputstr <> '\'
      insert @temp values(@inputstr)
      return 
    end
    go--调用
    declare @str as varchar(30)
    set @str = '1,2,3,4,5'select distinct m.* from tb m,
    (select * from dbo.fn_split(@str,',')) n
    where charindex(',' + n.a + ',' , ',' + m.typeid + ',') > 0drop table tb
    drop function dbo.fn_split /*
    ID          TypeID                         
    ----------- ------------------------------ 
    1           1,2,3,4,5,6,7,8,9,10,11,12
    2           2,3
    3           3,7,8,9
    4           2,6
    5           4,5
    (所影响的行数为 5 行)
    */------------------------------------------
    --使用动态SQL的语句。
    declare @str varchar(200)
    declare @sql as varchar(1000)
    set @str = '1,2,3,4,5'
    set @sql = 'select ''' + replace(@str , ',' , ''' as id union all select ''')
    set @sql = @sql + ''''
    set @sql = 'select distinct a.* from tb a , (' + @sql + ') b where charindex(' + ''','' + b.id + ' + ''',''' + ' , ' + ''','' + a.typeid + ' + ''',''' + ') > 0 '
    exec (@sql)
    /*
    ID          TypeID                         
    ----------- ------------------------------ 
    1           1,2,3,4,5,6,7,8,9,10,11,12
    2           2,3
    3           3,7,8,9
    4           2,6
    5           4,5
    (所影响的行数为 5 行)
    */
      

  11.   


    --把parm1构造成表结构,可写入临时表中
    exec('insert into #temp select '+replace(replace(param1,',', 'union all select'),'.',',')
    --select 1,资产负债表,11,2010,10 union all select 1,利润表,13,2010,10 union all select 2,资产负债表,11,2010,10 union all select 2,利润表,2010,10
      

  12.   

    还是切割吧!
    先逗号,再使用parsename切割三个点之间
      

  13.   


    我是 set @s='select @para3=sum(Data) from(
                 select Data from tb where '+@para1 + 'union all
                 select -Data from tb where '+@para2+')t '
         exec sp_executesql @s,N'@para3 int output',@para3 output
    这种方式拼接,执行的,在sql查询分析器里能执行成功,得到返回值,但是在c#代码里就得不到output的值。