SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO/*
目的是取得串号的 jhj。以分组的办法在多次进货中只取一次进货;
问题:
1、速度较慢。应避免无条件的查询,经测试,在只取一条时速度也有延迟,但可以接受;
2、取到的 jhj 只能大约估计。以现有逻辑,不能确定当前是哪个 jhj,取 min 是基于这样的估计——
价格通常都是向下调,min 一般就是最新价;
解决计划:
1、这里不分组,速度就会提高,但需要在应用逻辑中处理,凡是需要统计数量的,就需要先分组一次在统计;
2、更改逻辑,使得有标记可以标记到最后 jhj;
*/
CREATE VIEW dbo.view_sjch
AS
SELECT ch.id, ch.cgflag, ch.xsflag, min(shs.jhj) as jhj, min(shs.xnjhj) as xnjhj, 
min(shs.sccb) as sccb, b.售价, 0 as 现金消费币, ch.jhrq, ch.sjch, MAX(shs.lx) AS lx, b.型号, 
ch.bh, ch.pp, ch.pz, ch.ggxh, ch.ys, ch.mcks, ch.gys, 0 AS jhj1, 0 AS xnjhj1, 0 AS sccb1, 
ch.StorBookID
FROM dbo.shstores shs 
INNER JOIN dbo.sjch ch ON shs.bz = ch.sjch
INNER JOIN dbo.BASEINFO b ON ch.ggxh = b.型号
GROUP BY ch.id, ch.cgflag, ch.xsflag, b.售价,ch.jhrq, ch.sjch, b.型号, ch.bh, ch.pp, ch.pz, ch.ggxh, 
ch.ys, ch.mcks, ch.gys, ch.StorBookID
UNION
SELECT ch.id, ch.cgflag, ch.xsflag, 0 AS jhj, 0 AS xnjhj, 0 AS sccb, b.售价, 0 as 现金消费币, 
      ch.jhrq, ch.sjch, '费字段' AS lx, b.型号, ch.bh, ch.pp, ch.pz, ch.ggxh, ch.ys, ch.mcks, 
      ch.gys, min(shs.jhj) AS jhj1, min(shs.xnjhj) AS xnjhj1, min(shs.sccb) AS sccb1, 
      ch.StorBookID
FROM dbo.shstores shs INNER JOIN
      dbo.shstores_CH ON shs.id = dbo.shstores_CH.ID_shstores INNER JOIN
      dbo.sjch ch ON dbo.shstores_CH.ID_sjch = ch.id INNER JOIN
      dbo.BASEINFO b ON ch.ggxh = b.型号
GROUP BY ch.id, ch.cgflag, ch.xsflag, b.售价, ch.jhrq, ch.sjch, b.型号, ch.bh, 
      ch.pp, ch.pz, ch.ggxh, ch.ys, ch.mcks, ch.gys, ch.storbookidGO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO这是可能效率最低的视图。其他的,sjch 有10万数据,shstores 类似,outstore 大约 20 万,函数的目的是计算利润。比如计算某个部门一个月的利润,这个部门大约走几千条数据,现在需要10分钟。