复杂SQL解析

背景表

1、sale_log as result: 主表,大部分字段都是取自这个表

2、sale_num as sale:需要从这个表获取真实销量sale_num字段

3、schedule as snap: 需要从这个表获取最终售最大售卖量total_stock字段

SQL关键字

  • Case When Then End
( Case 1 When 1 Then '提高销售量' END) as `降低|带来多货|提高销量`;
  • 运算
(sale.sale_num - result.origin_max_sale) as `降低|带来多货|提高销量PCS`;
(sale.sale_num - result.origin_max_sale) * result.sku_price as `销售额提高`;

分析

在这里插入图片描述

1、result表 left join sale 表,并按照 where条件形成场景1-降多货

  • 其中left join中的on内容是result和sale二者中一一对应的关系字段
  • where条件即降多货的条件

2、result 表 left join sale 表,并按照 where条件形成场景2-提升售卖量即提升GMV

3、场景1 UNION ALL场景2,组成临时表t

4、result表left join snap表,组成临时表m

5、表t INNER JOIN 表m,组成最终的Sql语句,即

select
	t.主要字段,t.真实销量, m.最终最大售卖量
from t
inner join
	m
on
	t和m一一对应关系
where
	xxx

具体Sql

select distinct
	t.`商品SKUID`,
	t.`网店ID`,
	t.`网店名称`,
	t.`销售日期`,
	t.`角色`,
	t.`修改前数值`,
	t.`修改后数值`,
	t.`真实销量`,
	m.total_stock as `实际修改量`,
	t.`OR值`,
	t.`降低|带来多货|提高销量`,
	t.`降低|带来多货|提高销量PCS`,
	t.`销售价`
from(
	 (
        select
        	result.sku_id as `商品SKUID`,
            result.poi_id as `网店ID`,
        	sale.poi_name as `网店名称`,
        	result.sale_date as `销售日期`,
        	(CASE result.role WHEN 1 THEN '商家'  WHEN 2 THEN '普通用户' END) as `角色`,
        	result.origin_max_sale as `修改前数值`,
        	result.update_max_sale as `修改后数值`,
        	sale.sale_num as `真实销量`,
        	result.or_qty as `OR值`,
        	(CASE 1 WHEN 1 THEN '降低多货'  END) as `降低|带来多货|提高销量`,
        	(result.update_max_sale - result.origin_max_sale) as `降低|带来多货|提高销量PCS`,
        	result.sku_price as `销售价`
        from
        	sale_log as result
        Left join
        	sale_num as sale
        on
      		result.sku_id = sale.sku_id
        	and result.poi_id = sale.poi_id
        	and replace(result.sale_date,'_','') = sale.sale_date
        where
        	result.sale_date between '$$begindate' and '$$enddate'
        	and result.update_status = 1
        	and result.update_type = 1
        	and sale.sale_num < result.update_max_sale
        Order by
        	result.operate_time
        Desc
        Limit
        	5000000
    )
    
    Union All
    
    (
        select
        	result.sku_id as `商品SKUID`,
            result.poi_id as `网店ID`,
        	sale.poi_name as `网店名称`,
        	result.sale_date as `销售日期`,
        	(CASE result.role WHEN 1 THEN '商家'  WHEN 2 THEN '普通用户' END) as `角色`,
        	result.origin_max_sale as `修改前数值`,
        	result.update_max_sale as `修改后数值`,
        	sale.sale_num as `真实销量`,
        	result.or_qty as `OR值`,
        	(CASE 1 WHEN 1 THEN '提高销量'  END) as `降低|带来多货|提高销量`,
        	(result.update_max_sale - result.origin_max_sale) as `降低|带来多货|提高销量PCS`,
        	result.sku_price as `销售价`
        from
        	sale_log as result
        Left join
        	sale_num as sale
        on
      		result.sku_id = sale.sku_id
        	and result.poi_id = sale.poi_id
        	and replace(result.sale_date,'_','') = sale.sale_date
        where
        	result.sale_date between '$$begindate' and '$$enddate'
        	and result.update_status = 0
        	and result.update_type = 2
        	and sale.sale_num <= result.origin_max_sale
        Order by
        	result.operate_time
        Desc
        Limit
        	5000000
    )
) as t
Inner join(
    select
    	snap.total_stock as total_stock, snap.base_sku_id as base_sku_id, snap.poi_id as 	  poi_id,snap.schedule_date as schedule_date
    from
    	sale_log as result
    Left join
    	schedule as snap
    on
    	result.sku_id = snap.base_sku_id
    	and result.poi_id = sanp.poi_id
    	and result.sale_date = snap.schedule_date
    	and snap.dt = replace(snap.schedule_date,'-','')
    where
    	result.sale_date between '$$begindate' and '$$enddate' 
) as m

On
	t.`商品SKUID` = m.base_sku_id
	and t.`网店ID` = m.poi_id
	and t.`销售日期` = m.schedule_date
where
	t.`网店ID` in($poiId)

注意点

  • 注意‘’引号 和 ``的区别

补充:select的字段,也可以带有计算逻辑

select 
	e.name, e.age, e.salaty_of_month * 12 as `年薪`
from
	employee e
where
	xxx;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
批量sql解析为数组, SQL终结符解析 前段时间在写一个服务端程序的时候,需要用到mysql. 客户端连接服务端执行sql分好几种情况, { 查询SQL, 执行SQL, 执行SQL事务, 批量执行支持, 查询执行混合 } ... 其中的"批量执行"就有点让我头疼, 玩过sql的都知道, 批量执行一般以";" 终结符算一条sql语句, 以此分割. 难点就是把批量的sql语句, 分割为单条, 一个一个的执行.估计有的易友可能想到了"分割文本, 发送文本数组" 首先"发送文本数组", 我不喜欢,有时候显得麻烦. 其次"分割文本", 你可能会遇到这样以下这样的情况, 也就是sql字符串中出现了";", 你能怎么办? 你也很绝望对吧? INSERT INTO `User`(name) values('剑''齿;虎');SELECT LAST_INSERT_ID(); 以上问题还有, 字符串中包含单引号就需要用两个单引号表示.... 实在不想屈服于前面两种蛋疼的方式,试着自己封装子程序解析, 忽略字符串什么的. 有时候脑子是个好东西,可惜我好像没有似的... 感觉设计起来还挺复杂麻烦的,我没学过什么脚本设计,编译设计的. 于是前段时间论坛有几个帖子被顶起来了,一个叫"无间酱"的大佬制作了好几个练手的脚本语言设计, 我灵机一动...脚本也会遇到这样的问题, 就把源码中的解析终结符部分给抠出来了...总算说到重点了. 刚开始还不能直接用, 改了改还算可以了. INSERT INTO User (name,pwd) values('剑齿虎;哇', 'aabb');--注释A:插入语句-- SELECT * FROM User; /*注释B:查询*/ UPDATE User SET pwd='ac''c' WHERE uid=1 结果: 数组:3{ “INSERT INTO User (name,pwd) values('剑齿虎;哇', 'aabb');”, “--注释A:插入语句-- SELECT * FROM User;”, “/*注释B:查询*/ UPDATE User SET pwd='ac''c' WHERE uid=1” } 感觉瞬间正规了许多, 不用去使用那些"偏方", 导致出现各种各样的杯具

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值