“UNION   ALL”不能将“列”完全一样的记录合并吗???如下图:问题一:如上图,“第一条记录”和“第三条记录”是使用“UNION   ALL”关联起来的,而且这两条记录的列名完全一致。为什么这两条记录不会合并起来呢?              同时,将“01”、“02”、“03”、“04”、“05”、“06”、“07”、“08”、“10”、“11”、“12”列的数值加起来求和,作为合并后的记录的值。
问题二:“UNION   ALL”不支持这样的功能吗?    如果要实现这样的功能应该怎么办???   用什么方法,有实例可以参考吗?

解决方案 »

  1.   

    UNION ALL 合并的时候不会去重复 使用UNION会去掉重复数据
      

  2.   

    SELECT buildingno ,buildingname,buildingfunction,circuittype,unit,SUM([01]) [01],.....后面同理
    FROM 
    (SELECT buildingno ,buildingname,buildingfunction,circuittype,unit,ISNULL([01],0) [01].....后面同理
    FROM 表
    WHERE 第一条数据
    UNION ALL 
    SELECT buildingno ,buildingname,buildingfunction,circuittype,unit,ISNULL([01],0) [01].....后面同理
    FROM 表
    WHERE 第三条数据
    )a
    GROUP BY buildingno ,buildingname,buildingfunction,circuittype,unit
      

  3.   

    union all 只是做为将多个不相关的记录集合并成一个记录集,如果想达到你说的效果把 合并后的记录集 做为一个子表,再进行分组 group by  就能达到你说的效果了
    例如select p1,p2,p3,sum(p4) as p4,sum(p5) as p5
    from (
      select p1,p2,p3,p4,p5
      union all
      select p1,p2,p3,p4,p5
    ) t1
    group by p1,p2,p3
      

  4.   

    不能直接sum,不能sum(null)的,会报错。
      

  5.   

    不用写的这么细把,如果有 null 值,在union all 时,用isnull 判断一下呗
      

  6.   

    SUM NULL不会错的,自动去掉NULL的
      

  7.   

    select sum(null)消息 8117,级别 16,状态 1,第 1 行
    操作数数据类型 NULL 对于 sum 运算符无效。我反正试过了才说的
      

  8.   

    多谢各位大师,问题解决了,求和就可以了。但是小弟还有一个其它问题想请教下。还请各位大师指教。
    set @CircuitType  = ''''+ REPLACE(@CircuitType,',',''',''')+''''
    print @CircuitType“print” 出来的值为 “  'A','E'  ”现在想判断“@CircuitType”中是否包含“   A   ”应该怎样判断呢???   请各位大侠指教。
    小弟这样判断的,但是不行啊。if CHARINDEX(@CircuitType,'A')>0
      

  9.   


    谢谢大师, LIKE '%A%'  可以作为  “if”判定条件的。
      

  10.   


    select  BuildingNo,BuildName,BuildingFunction,CircuitType,Unit,01,02,03,04,05,06,07,08,10,11,12,(01+02+03+04+05+06+07+08+10+11+12)
    from 
    (
    select 
    union all
    select 
    union all
    select 
    union all
    select 
    union all
    select 
    union all
    )
    group by BuildingNo,BuildName,BuildingFunction,CircuitType,Unit,01,02,03,04,05,06,07,08,10,11,12,(01+02+03+04+05+06+07+08+10+11+12)
      

  11.   

    谢谢各位大师,但为什么,LIKE '%A%' 可以作为 “if”判定条件的。而,if CHARINDEX(@CircuitType,'A')>0  却不行呢?为什么呢?
      

  12.   

    因为CHARINDEX 是在 expression2 中搜索 expression1 并返回其起始位置,位置本来就不应该存在大于小于的概念,只有存不存在的概念。虽然你看到的值是一个数字,但是其实它指的是一个位置。
      

  13.   


    它没有返回数字吗?难道是if CHARINDEX(@CircuitType,'A')这样吗?
    SQL里没有“Split”对吧?   一般使用“Replace”处理字符串,因为没有数组。
      

  14.   

    大师们,nvarchar不是可变长度吗?declare @DateListSum nvarchar(100)
    为什么  “@DateListSum” 超过100了,再拼接字符串,字符显示不出来了,为什么?
      

  15.   

    Split在sql里面就是charindex和其他的组合。declare @DateListSum nvarchar(100)
    你只定了100位,多了肯定显示不出来,变长的意思是在100以内可以变动,但是超过了就显示不了了
      

  16.   

    UNIION才能合并,而且那两条记录后面的数据不一样是不能直接合并 的
      

  17.   


    SQL中有没有向外变动的类型呢?  自动根据字符串的长度变长而变长。  大师
      

  18.   

    谢谢各位大师,江湖救急了。SQL语句:       declare  @DateValue nvarchar(150)
           declare @DateListSum nvarchar(150)
           set @DateValue='2010,2011,2012'
           set @DateListSum =  'sum(isnull('  +REPLACE(@DateValue,',',',0)),sum(isnull(')  +',0))'       print @DateValue
           print @DateListSum
           print 'sum(isnull(2010,0)) 2010,sum(isnull(2011,0)) 2011,sum(isnull(2012,0)) 2012'运行结果:      2010,2011,2012
          sum(isnull(2010,0)),sum(isnull(2011,0)),sum(isnull(2012,0))
          sum(isnull(2010,0)) 2010,sum(isnull(2011,0)) 2011,sum(isnull(2012,0)) 2012问题:        现在的SQL语句中可以将“ 2010,2011,2012”转化为“sum(isnull(2010,0)),sum(isnull(2011,0)),sum(isnull(2012,0))” , 但是怎样转化为“sum(isnull(2010,0))    2010,sum(isnull(2011,0))    2011,sum(isnull(2012,0))     2012”  呢???       也就是作完“sum”求和后,加上原有的列名,SQL应该怎样处理呢?
      

  19.   

    问题一:如上图,“第一条记录”和“第三条记录”是使用“UNION ALL”关联起来的,而且这两条记录的列名完全一致。为什么这两条记录不会合并起来呢? 亏你楼主还截图了,完全一样吗?
      

  20.   

    第一条记录与第三条不一样啊
    要是想求和,先把NULL值处理一下
      

  21.   

    charindex函数的参数您用反了。应该是:
    if CHARINDEX('A', @CircuitType)>0
      

  22.   

    不能将“ 2010,2011,2012”转化为“sum(isnull(2010,0)) 2010,sum(isnull(2011,0)) 2011,sum(isnull(2012,0)) 2012” 。只能写个小存储过程,将每个逗号分隔出来的单元写成F(x) x,然后再连接起来。
      

  23.   

    一种写法是:
    declare @s nvarchar(100), @result nvarchar(100), @i int;set @s = 'x,y,z';
    set @s = @s + ',';while (charindex(',', @s) > 0) and (len(@s) > 1)
    begin
    set @result = isnull(@result, '') + 'sum(isnull(' + substring(@s, 1, charindex(',', @s) - 1) + ',0)) ' + substring(@s, 1, charindex(',', @s) - 1) + ', '; set @s = substring(@s, charindex(',', @s) + 1, len(@s));
    end;set @result = substring(@result, 1, len(@result) - 1);select @result;