当前位置: 代码迷 >> Sql Server >> mssql存储过程中同比有关问题
  详细解决方案

mssql存储过程中同比有关问题

热度:94   发布时间:2016-04-24 08:47:08.0
mssql存储过程中同比问题
一张表中 求与上一年的 同比 ym后两位相同的进行计算(2014开头的减去2013开头的求同比)
比如 (201510 - 201410 / 201410 )  



想得到的结果如下

后面还有 201509与201409,201503与201403,201505数据为0 ,201405的数据则为21 没有同比

写存储过程传入年份显示全年12个月的同比数据

------解决思路----------------------
-- 参数
DECLARE @y int
SET @y = 2015

;WITH
/* 测试数据
table1(num1,ym)AS(
    SELECT CONVERT(decimal(5,2),21.00),201503 UNION ALL
    SELECT  3.00,201509 UNION ALL
    SELECT  6.00,201510 UNION ALL
    SELECT  7.00,201403 UNION ALL
    SELECT 21.00,201405 UNION ALL
    SELECT  2.00,201409 UNION ALL
    SELECT  4.00,201410
), */
a AS (
    SELECT num1,
           ym % 100 AS m
      FROM table1
     WHERE (ym / 100) = @y
)
,b AS (
    SELECT num1,
           ym % 100 AS m
      FROM table1
     WHERE (ym / 100) = (@y - 1)
)
,c AS (
    SELECT number AS m
      FROM master..spt_values
     WHERE type = 'p'
       AND number BETWEEN 1 AND 12
)
    SELECT c.m,
           a.num1,
           b.num1,
           CASE WHEN ISNULL(b.num1,0) = 0 THEN
                NULL
           ELSE
                1.0*(ISNULL(a.num1,0)-b.num1)/b.num1
           END AS rate
      FROM c
 LEFT JOIN a ON c.m = a.m
 LEFT JOIN b ON c.m = b.m

          m           num1           num1           rate
----------- -------------- -------------- --------------
          1           NULL           NULL           NULL
          2           NULL           NULL           NULL
          3          21.00           7.00    2.000000000
          4           NULL           NULL           NULL
          5           NULL          21.00   -1.000000000
          6           NULL           NULL           NULL
          7           NULL           NULL           NULL
          8           NULL           NULL           NULL
          9           3.00           2.00    0.500000000
         10           6.00           4.00    0.500000000
         11           NULL           NULL           NULL
         12           NULL           NULL           NULL
  相关解决方案