能不能光用SQL实现同比和环比  SQL  server

image.pngimage.png

用户K0035705 发布于 2020-11-10 11:07 (编辑于 2020-11-10 13:44)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共2回答
最佳回答
0
snrtuemcLv8专家互助
发布于2020-11-10 11:10(编辑于 2020-11-10 11:13)

可以在自带frdemo中使用测试下,输入2011年

image.png



select t.m,t.ym,
      t.销量,
      t1.销量 同期,
      (case when t1.销量 is null then '' 
          else (t.销量-t1.销量)/t1.销量 end) 同比,
      t2.销量 上期,
      (case when t2.销量 is null then '' 
          else (t.销量-t2.销量)/t2.销量 end) 环比
from 
(
select strftime('%m',b.订购日期)+0 m,
      strftime('%Y-%m',b.订购日期) ym,
      sum(a.数量) 销量
from 订单明细 a
    left join 订单 b on a.订单ID=b.订单ID
where strftime('%Y',b.订购日期) = '${y}'
group by strftime('%Y-%m',b.订购日期)
) t
left join
(
select strftime('%m',b.订购日期)+0 m,
      strftime('%Y-%m',b.订购日期) ym,
      sum(a.数量) 销量
from 订单明细 a
    left join 订单 b on a.订单ID=b.订单ID
where strftime('%Y',b.订购日期) = '${y-1}'
group by strftime('%Y-%m',b.订购日期)
) t1 on t.m=t1.m
left join
(
select (case when strftime('%m',b.订购日期)+0 <=11
        then strftime('%m',b.订购日期)+1 end) m,
      strftime('%Y-%m',b.订购日期) ym,
      sum(a.数量) 销量
from 订单明细 a
    left join 订单 b on a.订单ID=b.订单ID
where strftime('%Y',b.订购日期) = '${y}'
group by strftime('%Y-%m',b.订购日期)
) t2 on t.m=t2.m
  • 用户K0035705 用户K0035705(提问者) 我这是SQL server,适用嘛
    2020-11-10 11:13 
  • snrtuemc snrtuemc 回复 用户K0035705(提问者) strftime函数换成CONVERT函数 具体使用参考https://www.cnblogs.com/itjeff/p/13024271.html
    2020-11-10 11:16 
  • 用户K0035705 用户K0035705(提问者) 回复 snrtuemc CONVERT函数是不是只能用于转换格式啊,不能截取年或月吧
    2020-11-10 13:49 
  • yuejuntao yuejuntao 回复 用户K0035705(提问者) 你CONVERT后在前面加个LEFT啊截取就行了,
    2021-01-15 17:08 
最佳回答
0
冥河Lv8初级互助
发布于2020-11-10 11:19

参考博文:https://www.cnblogs.com/zhangzhu/articles/2495035.html

  • 用户K0035705 用户K0035705(提问者) SELECT CONVERT ( VARCHAR ( 10 ), c.InputTime, 23 ) AS 对比年月, c.CONTRACTSUM AS 本月销售总量, d.CONTRACTSUM AS 上月销售总量, CASE WHEN d.CONTRACTSUM IS NULL OR d.CONTRACTSUM= 0 THEN \'无穷大\' ELSE CAST ( CAST ( ( isnull( c.CONTRACTSUM, 0 ) - isnull( d.CONTRACTSUM, 0 ) ) * 100 / isnull( d.CONTRACTSUM, 0 ) AS DECIMAL ( 10, 2 ) ) AS VARCHAR ( 50 ) ) + \'%\' END AS 环比 FROM dbo.outCONTRACT c LEFT JOIN ( SELECT distinct a.CONTRACTSUM AS CONTRACTSUM, a.InputTime AS lsInputTime, b.InputTime AS InputTime FROM dbo.outCONTRACT a JOIN dbo.outCONTRACT b ON a.inputtime= DateAdd( MONTH, - 1, b.inputtime ) ) d ON c.inputtime= d.inputtime
    2020-11-10 13:43 
  • 用户K0035705 用户K0035705(提问者) 还有重复数据,这是啥情况啊
    2020-11-10 13:45 
  • 2关注人数
  • 574浏览人数
  • 最后回答于:2020-11-10 13:44
    请选择关闭问题的原因
    确定 取消
    返回顶部