求2021年10月各型号销售、期初期末库存的SQL查询写法
适配需求的SQL查询
%%time SELECT vt_sales_cube_sz.modc_barc2 model, SUM(vt_sales_cube_sz.qnt) sales, -- 统计当月第一天的期初库存 SUM(CASE WHEN vt_date_cube2.id_calendar_int = (SELECT MIN(id_calendar_int) FROM vt_date_cube2 WHERE wk_year_id = 2021 AND wk_MoY_id = 10) THEN vt_stocks_cube_sz.qty ELSE 0 END) AS opening_stock, -- 统计当月最后一天的期末库存 SUM(CASE WHEN vt_date_cube2.id_calendar_int = (SELECT MAX(id_calendar_int) FROM vt_date_cube2 WHERE wk_year_id = 2021 AND wk_MoY_id = 10) THEN vt_stocks_cube_sz.qty ELSE 0 END) AS closing_stock FROM vt_sales_cube_sz LEFT JOIN vt_date_cube2 ON vt_sales_cube_sz.id_calendar_int = vt_date_cube2.id_calendar_int LEFT JOIN vt_stocks_cube_sz ON vt_stocks_cube_sz.parent_modc_barc = vt_sales_cube_sz.modc_barc AND vt_stocks_cube_sz.id_stock = vt_sales_cube_sz.id_stock AND vt_stocks_cube_sz.id_calendar_int = vt_sales_cube_sz.id_calendar_int AND vt_stocks_cube_sz.vipusk_type = vt_sales_cube_sz.price_type WHERE vt_date_cube2.wk_year_id = 2021 AND vt_date_cube2.wk_MoY_id = 10 AND vt_sales_cube_sz.id_stock IN (SELECT id_stock FROM vt_warehouse_cube WHERE channel = 'OffLine') GROUP BY vt_sales_cube_sz.modc_barc2
改动说明
- 新增两个条件聚合字段分别统计期初、期末库存:先通过子查询获取2021年10月日历表中最小(对应当月第一天)和最大(对应当月最后一天)的
id_calendar_int值,再用CASE WHEN匹配对应日期的库存记录求和,替代原有的全月库存求和逻辑 - 完全保留原有销售求和逻辑、表关联规则、过滤条件,不会影响原有销售统计的准确性
- 若需要期初/期末无库存时返回NULL而非0,删除
CASE WHEN逻辑中的ELSE 0即可
内容的提问来源于stack exchange,提问作者user16795517
相关产品推荐
相关产品推荐

