有三个表A、B和C
A表:
编码
1
2
3
+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,其中的数据只是简单举例,实际数据是动态变化的。不知视图语句应该怎么写,请高手指点!
A表:
编码
1
2
3
+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,其中的数据只是简单举例,实际数据是动态变化的。不知视图语句应该怎么写,请高手指点!
union all
select '+1+2',时间,sum(数据) as 数据 where 编码 in(1,2) group by 时间
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 行)
*/
--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
left outer join B on 1=1
left outer join C on A.编码 like '%'+C.站号+'%' and C.时间=B.时间 group by A.编码,B.时间
汗......我都没仔细看....chuifengde是用这些语句先创建你那几张表的.
你弄的时候不要弄它上面那些创建表的语句....
不过,xQuery这条路应该是走的通的.
--------------------------------
xQuery中其中很重要的一个应用就是同组合并,
楼主是按照日期来分组的,
编号中使用加号'+'连接,
后面的数量使用SUM求和.