有三个表A、B和C 
A表: 
编码  
1    
2  

+1+2 B表:
时间
2008-1-1
   
C表: 
站号  时间      数据 
1    2008-1-1  100
1    2008-1-2  200
2    2008-1-1  200
2    2008-1-2  300 
3    2008-1-1  400
... 现在需要建立一个视图D,需要找出对应时间和编码的数据
视图D
编码   时间       数据 
1     2008-1-1   100   
2     2008-1-1   200 
3     2008-1-1   400  
+1+2  2008-1-1   300 其中编码+1+2是要实现站号1对应时间的数据100和站号2对应时间的数据200相加得300,其中的数据只是简单举例,实际数据是动态变化的。不知视图语句应该怎么写,请高手指点!

解决方案 »

  1.   

    ……
    union all
    select '+1+2',时间,sum(数据) as 数据 where 编码 in(1,2) group by 时间
      

  2.   

    DECLARE @a table(bm varchar(20))  
    INSERT @a SELECT '1'    
    UNION ALL SELECT '2'  
    UNION ALL SELECT '3' 
    UNION ALL SELECT '+1+2' DECLARE @b table(sj varchar(20))
    INSERT @b SELECT '2008-1-1' 
    declare @c table(zh varchar(20),sj varchar(20),sjj int)
    INSERT @c SELECT '1'    ,'2008-1-1'  ,100
    UNION ALL SELECT '1'    ,'2008-1-2',  200 
    UNION ALL SELECT '2'    ,'2008-1-1',  200 
    UNION ALL SELECT '2'    ,'2008-1-2',  300 
    UNION ALL SELECT '3'    ,'2008-1-1',  400 SELECT bm,aa.sj,sjj=isnull(sjj,(SELECT sum(sjj) FROM @c WHERE sj=aa.sj AND charindex('+'+zh+'+',bm+'+')>0))
    from
    (SELECT * FROM @a a CROSS JOIN @b b)aa
    LEFT JOIN 
    @c cc
    ON bm=zh AND aa.sj=cc.sj
    --result
    /*bm                   sj                   sjj         
    -------------------- -------------------- ----------- 
    1                    2008-1-1                     100 
    2                    2008-1-1                     200 
    3                    2008-1-1                     400 
    +1+2                 2008-1-1                     300 (所影响的行数为 4 行)
    */
      

  3.   


    --TRY::
    CREATE TABLE XX(A VARCHAR(300))
    INSERT INTO XX
    SELECT '1' UNION ALL
    SELECT '2' UNION ALL
    SELECT '3' UNION ALL
    SELECT '+1+2' 
     
    CREATE TABLE YY(B DATETIME)
    INSERT INTO YY VALUES('2008-01-01')CREATE TABLE ZZ(C VARCHAR(20),B DATETIME,DATA INT)
    INSERT INTO ZZ
    SELECT '1','2008-01-01',100 UNION ALL
    SELECT '1','2008-01-02',200 UNION ALL
    SELECT '2','2008-01-01',200 UNION ALL 
    SELECT '2','2008-01-02',300 UNION ALL 
    SELECT '3','2008-01-01',400  CREATE VIEW V_X
    AS
    SELECT xxtable.TT,YY.B,SUM(ZZ.DATA)MM FROM 
    (
    SELECT ROW_NUMBER() OVER(ORDER BY GETDATE()) TT,CAST(replace((CASE WHEN LEFT(A,1)<>'+' THEN '<r>'+A ELSE 
    stuff(a,1,1,'<r>') END+'</r>'),'+','</r><r>')AS XML) col  FROM XX  ) xxtable
    CROSS APPLY
        (SELECT V=t.col.value('.','VARCHAR(10)') FROM xxtable.col.nodes('//r') AS t(col) 
    ) b,YY,ZZ WHERE B.V=ZZ.C AND YY.B=ZZ.B 
    GROUP BY xxtable.TT,YY.BSELECT * FROM V_X
      

  4.   

    chuifengde,为什么会有“查询设计器不支持 DECLARE TABLE SQL 构造”提示?
      

  5.   

    chuifengde,为什么会有“查询设计器不支持 DECLARE TABLE SQL 构造”提示?
      

  6.   

    declare table SQL在存储过程中可用.在视图中不可用.
      

  7.   

    select A.编码,B.时间,sum(C.数据) as 数据 from A 
    left outer join B on 1=1
    left outer join C on A.编码 like '%'+C.站号+'%' and C.时间=B.时间 group by A.编码,B.时间
      

  8.   


    汗......我都没仔细看....chuifengde是用这些语句先创建你那几张表的.
    你弄的时候不要弄它上面那些创建表的语句....
      

  9.   

    把select语句中@a,@b,@c改成你相应的表测试一下就行了,这三个declare是我定义的表
      

  10.   

    9楼的应该是个方法,没有验证对不对,
    不过,xQuery这条路应该是走的通的.
    --------------------------------
    xQuery中其中很重要的一个应用就是同组合并,
    楼主是按照日期来分组的,
    编号中使用加号'+'连接,
    后面的数量使用SUM求和.