S1S4_UAT_P0_试导SQL草案_20260604.sql 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. -- =============================================================================
  2. -- S1-S4 全局 UAT P0 试导 SQL 草案
  3. -- 批次:S1S4_UAT_20260604_RQ_V1
  4. -- 租户:797403760988229(AIDOP) | 禁止:1300000000888(Demo)
  5. -- 依据:doc/plan/S1-S4全局UAT场景测试数据生成方案.md
  6. --
  7. -- 【重要】第一阶段:Section 0 为只读检查(可执行);Section 1-4 为 DML 草案(默认注释)。
  8. -- 正式写库前必须:① 从 dopdemorq 灌入 tmp_* 表 ② 人工审阅 ③ 取消注释后执行
  9. -- =============================================================================
  10. -- -----------------------------------------------------------------------------
  11. -- Section 0:只读检查(安全可执行)
  12. -- -----------------------------------------------------------------------------
  13. SET @tenant_aidop := 797403760988229;
  14. SET @tenant_demo := 1300000000888;
  15. SET @batch_no := 'S1S4_UAT_20260604_RQ_V1';
  16. -- 0.1 租户隔离:AIDOP vs Demo
  17. SELECT 'crm_seorder' AS tbl, tenant_id, COUNT(*) AS cnt
  18. FROM crm_seorder WHERE tenant_id IN (@tenant_aidop, @tenant_demo)
  19. GROUP BY tenant_id;
  20. SELECT 'mes_morder' AS tbl, tenant_id, COUNT(*) AS cnt
  21. FROM mes_morder WHERE tenant_id IN (@tenant_aidop, @tenant_demo)
  22. GROUP BY tenant_id;
  23. SELECT 'PurOrdMaster' AS tbl, tenant_id, COUNT(*) AS cnt
  24. FROM PurOrdMaster WHERE tenant_id IN (@tenant_aidop, @tenant_demo)
  25. GROUP BY tenant_id;
  26. -- 0.2 P0 单号冲突(应为空)
  27. SELECT bill_no, tenant_id, COUNT(*) AS cnt
  28. FROM crm_seorder
  29. WHERE bill_no IN (
  30. 'MPO482024102300001', 'MPO482025010900002', 'MPO482025012100001',
  31. 'MPO482024120200003', 'MPO482025010800003'
  32. )
  33. GROUP BY bill_no, tenant_id;
  34. -- 0.3 现有 AIDOP 主线(导入后用于对比,不应与 P0 批次混淆)
  35. SELECT bill_no, bill_from, custom_no, date
  36. FROM crm_seorder
  37. WHERE tenant_id = @tenant_aidop;
  38. -- 0.4 全局链路验收探针(导入后执行;当前仅结构预览)
  39. /*
  40. SELECT so.bill_no, COUNT(DISTINCT se.Id) AS line_cnt,
  41. COUNT(DISTINCT mo.Id) AS morder_cnt,
  42. COUNT(DISTINCT pm.PurOrd) AS po_cnt
  43. FROM crm_seorder so
  44. LEFT JOIN crm_seorderentry se ON se.seorder_id = so.Id AND se.tenant_id = @tenant_aidop
  45. LEFT JOIN mes_moentry me ON me.soentry_id = se.Id AND me.tenant_id = @tenant_aidop
  46. LEFT JOIN mes_morder mo ON mo.Id = me.moentry_moid AND mo.tenant_id = @tenant_aidop
  47. LEFT JOIN PurOrdMaster pom ON pom.SalesOrd = so.bill_no AND pom.tenant_id = @tenant_aidop
  48. LEFT JOIN PurOrdDetail pm ON pm.PurOrd = pom.PurOrd AND pm.tenant_id = @tenant_aidop
  49. WHERE so.tenant_id = @tenant_aidop
  50. AND so.bill_from LIKE CONCAT('UAT导入:', @batch_no, '%')
  51. GROUP BY so.bill_no;
  52. */
  53. -- -----------------------------------------------------------------------------
  54. -- Section 1:全局变量与 ID 映射(DML 草案 — 默认注释)
  55. -- -----------------------------------------------------------------------------
  56. /*
  57. SET @tenant_id := 797403760988229;
  58. SET @batch_no := 'S1S4_UAT_20260604_RQ_V1';
  59. SET @operator_id := 1300000000111;
  60. SET @operator_name:= 'UAT数据导入';
  61. SET @now := NOW();
  62. SET @factory_id := 797403760988229;
  63. SET @id_base := 9106000400000001; -- 新 ID 基址,避开现有 800xxx 段
  64. -- 全局 ID 映射表(会话级)
  65. DROP TEMPORARY TABLE IF EXISTS tmp_s1s4_uat_id_map;
  66. CREATE TEMPORARY TABLE tmp_s1s4_uat_id_map (
  67. batch_no VARCHAR(64) NOT NULL,
  68. entity_name VARCHAR(64) NOT NULL,
  69. source_key VARCHAR(128) NOT NULL,
  70. target_id BIGINT NOT NULL,
  71. ref_key VARCHAR(128) NULL,
  72. PRIMARY KEY (batch_no, entity_name, source_key)
  73. );
  74. -- P0 五单:销售订单 ID 预分配
  75. INSERT INTO tmp_s1s4_uat_id_map VALUES
  76. (@batch_no,'crm_seorder','MPO482024102300001',@id_base+1,'MPO482024102300001'),
  77. (@batch_no,'crm_seorder','MPO482025010900002',@id_base+2,'MPO482025010900002'),
  78. (@batch_no,'crm_seorder','MPO482025012100001',@id_base+3,'MPO482025012100001'),
  79. (@batch_no,'crm_seorder','MPO482024120200003',@id_base+4,'MPO482024120200003'),
  80. (@batch_no,'crm_seorder','MPO482025010800003',@id_base+5,'MPO482025010800003');
  81. -- 订单明细 ID:每单 2 行 => @id_base+101 .. +110
  82. -- 工单 ID:每明细 1 工单 => @id_base+201 .. +210
  83. -- 采购订单号:PO-UAT-001 .. PO-UAT-005
  84. */
  85. -- -----------------------------------------------------------------------------
  86. -- Section 2:S1 销售订单(链路起点)
  87. -- -----------------------------------------------------------------------------
  88. /*
  89. -- 2.1 中间表:从 dopdemorq 抽取后灌入(字段为占位,须替换)
  90. DROP TEMPORARY TABLE IF EXISTS tmp_s1_uat_so;
  91. CREATE TEMPORARY TABLE tmp_s1_uat_so (
  92. bill_no VARCHAR(64) NOT NULL PRIMARY KEY,
  93. target_id BIGINT NOT NULL,
  94. custom_no VARCHAR(64) NULL,
  95. custom_name VARCHAR(128) NULL,
  96. order_date DATETIME NULL,
  97. delivery_date DATETIME NULL,
  98. urgent INT DEFAULT 0,
  99. status INT DEFAULT 1
  100. );
  101. INSERT INTO tmp_s1_uat_so VALUES
  102. ('MPO482024102300001', @id_base+1, 'CUST0005', 'ET0005', '2024-10-23', '2024-11-30', 0, 1),
  103. ('MPO482025010900002', @id_base+2, 'CUST0005', 'ET0005', '2025-01-09', '2025-02-28', 0, 1),
  104. ('MPO482025012100001', @id_base+3, 'CUST0005', 'ET0005', '2025-01-21', '2025-03-15', 1, 1),
  105. ('MPO482024120200003', @id_base+4, 'CUST0005', 'ET0005', '2024-12-02', '2025-01-20', 0, 1),
  106. ('MPO482025010800003', @id_base+5, 'CUST0005', 'ET0005', '2025-01-08', '2025-02-20', 0, 1);
  107. INSERT INTO crm_seorder (
  108. Id, bill_no, order_type, custom_no, custom_name,
  109. date, rdate, urgent, bill_from, closed, IsDeleted,
  110. create_by_name, create_time, update_by_name, update_time,
  111. tenant_id, factory_id
  112. )
  113. SELECT
  114. target_id, bill_no, 1, custom_no, custom_name,
  115. order_date, delivery_date, urgent,
  116. CONCAT('UAT导入:', @batch_no),
  117. 0, 0,
  118. @operator_name, @now, @operator_name, @now,
  119. @tenant_id, @factory_id
  120. FROM tmp_s1_uat_so;
  121. -- 2.2 订单明细(每单 2 行;item_number/qty 须从旧库替换)
  122. DROP TEMPORARY TABLE IF EXISTS tmp_s1_uat_so_line;
  123. CREATE TEMPORARY TABLE tmp_s1_uat_so_line (
  124. target_id BIGINT NOT NULL PRIMARY KEY,
  125. bill_no VARCHAR(64) NOT NULL,
  126. entry_seq INT NOT NULL,
  127. item_number VARCHAR(64) NULL,
  128. item_name VARCHAR(128) NULL,
  129. qty DECIMAL(18,4) NULL,
  130. plan_date DATETIME NULL
  131. );
  132. -- 示例:MPO482024102300001 两行
  133. INSERT INTO tmp_s1_uat_so_line VALUES
  134. (@id_base+101,'MPO482024102300001',1,'ITEM-P0-01','成品A',100,'2024-11-15'),
  135. (@id_base+102,'MPO482024102300001',2,'ITEM-P0-02','成品B', 50,'2024-11-20');
  136. -- ... 其余 8 行按同模式从 dopdemorq 补全
  137. INSERT INTO crm_seorderentry (
  138. Id, seorder_id, bill_no, entry_seq, item_number, item_name,
  139. qty, plan_date, date, IsDeleted,
  140. create_by_name, create_time, update_by_name, update_time,
  141. tenant_id, factory_id, seorderentry_id
  142. )
  143. SELECT
  144. l.target_id, m.target_id, l.bill_no, l.entry_seq,
  145. l.item_number, l.item_name, l.qty, l.plan_date, s.order_date, 0,
  146. @operator_name, @now, @operator_name, @now,
  147. @tenant_id, @factory_id, l.target_id
  148. FROM tmp_s1_uat_so_line l
  149. JOIN tmp_s1_uat_id_map m ON m.entity_name='crm_seorder' AND m.ref_key=l.bill_no AND m.batch_no=@batch_no
  150. JOIN tmp_s1_uat_so s ON s.bill_no = l.bill_no;
  151. */
  152. -- -----------------------------------------------------------------------------
  153. -- Section 3:S2 工单(必须来源于 S1 订单明细)
  154. -- -----------------------------------------------------------------------------
  155. /*
  156. -- 3.1 mes_morder + mes_moentry:soentry_id 关联 crm_seorderentry.Id
  157. DROP TEMPORARY TABLE IF EXISTS tmp_s2_uat_morder;
  158. CREATE TEMPORARY TABLE tmp_s2_uat_morder (
  159. target_mo_id BIGINT NOT NULL PRIMARY KEY,
  160. target_me_id BIGINT NOT NULL,
  161. soentry_id BIGINT NOT NULL,
  162. bill_no VARCHAR(64) NOT NULL,
  163. morder_no VARCHAR(128) NOT NULL,
  164. product_code VARCHAR(128) NULL,
  165. need_number DECIMAL(23,10) NULL
  166. );
  167. INSERT INTO tmp_s2_uat_morder VALUES
  168. (@id_base+201, @id_base+301, @id_base+101, 'MPO482024102300001', 'WO-UAT-2024-001', 'ITEM-P0-01', 100),
  169. (@id_base+202, @id_base+302, @id_base+102, 'MPO482024102300001', 'WO-UAT-2024-002', 'ITEM-P0-02', 50);
  170. -- ... 其余 8 工单
  171. INSERT INTO mes_morder (
  172. Id, morder_no, morder_date, morder_state, product_code, product_name,
  173. need_number, morder_production_number, IsDeleted, urgent,
  174. create_by_name, create_time, update_by_name, update_time,
  175. tenant_id, factory_id
  176. )
  177. SELECT
  178. target_mo_id, morder_no, @now, 'Released', product_code, product_code,
  179. need_number, need_number, 0, 0,
  180. @operator_name, @now, @operator_name, @now,
  181. @tenant_id, @factory_id
  182. FROM tmp_s2_uat_morder;
  183. INSERT INTO mes_moentry (
  184. Id, moentry_moid, moentry_mono, soentry_id, fbill_no,
  185. need_number, morder_production_number, IsDeleted,
  186. create_by_name, create_time, tenant_id, factory_id
  187. )
  188. SELECT
  189. target_me_id, target_mo_id, morder_no, soentry_id, bill_no,
  190. need_number, need_number, 0,
  191. @operator_name, @now, @tenant_id, @factory_id
  192. FROM tmp_s2_uat_morder;
  193. -- 3.2 WorkOrdMaster:供 S2 排程/日计划页(WorkOrd = morder_no)
  194. INSERT INTO WorkOrdMaster (
  195. Domain, WorkOrd, ItemNum, Status, QtyOrded, QtyCompleted, LbrVar,
  196. OrdDate, DueDate, SalesJob, tenant_id, CreateTime, UpdateTime
  197. )
  198. SELECT
  199. CAST(@factory_id AS CHAR), morder_no, product_code, 'R',
  200. need_number, 0, 0,
  201. @now, DATE_ADD(@now, INTERVAL 14 DAY), bill_no,
  202. @tenant_id, @now, @now
  203. FROM tmp_s2_uat_morder;
  204. */
  205. -- -----------------------------------------------------------------------------
  206. -- Section 4:S3 物料需求 / 采购(必须来源于 S2 工单)
  207. -- -----------------------------------------------------------------------------
  208. /*
  209. -- 4.1 采购申请 srm_pr_main(每条工单至少 1 条缺料申请)
  210. DROP TEMPORARY TABLE IF EXISTS tmp_s3_uat_pr;
  211. CREATE TEMPORARY TABLE tmp_s3_uat_pr (
  212. voucher BIGINT NOT NULL PRIMARY KEY,
  213. pr_billno VARCHAR(64) NOT NULL,
  214. morder_no VARCHAR(128) NOT NULL,
  215. icitem_name VARCHAR(255) NULL,
  216. pr_rqty DECIMAL(18,4) NULL
  217. );
  218. INSERT INTO tmp_s3_uat_pr VALUES
  219. (@id_base+401, 'PR-UAT-001', 'WO-UAT-2024-001', '原料M1', 200),
  220. (@id_base+402, 'PR-UAT-002', 'WO-UAT-2024-001', '原料M2', 100);
  221. -- ... 按工单扩展
  222. INSERT INTO srm_pr_main (
  223. voucher, Id, pr_billno, pr_purchaseid, pr_purchasenumber, pr_purchasename,
  224. icitem_id, icitem_name, pr_rqty, pr_aqty, state, pr_type, currencytype,
  225. create_by_name, create_time, update_by_name, update_time,
  226. tenant_id, factory_id, IsDeleted, Remark
  227. )
  228. SELECT
  229. voucher, voucher, pr_billno, 0, morder_no, morder_no,
  230. 0, icitem_name, pr_rqty, 0, 1, 1, 0,
  231. @operator_name, @now, @operator_name, @now,
  232. @tenant_id, @factory_id, 0, CONCAT('UAT:', @batch_no)
  233. FROM tmp_s3_uat_pr;
  234. -- 4.2 采购订单 PurOrdMaster / PurOrdDetail(SalesOrd + WorkOrd 回指 S1/S2)
  235. -- PO-UAT-001 关联 MPO482024102300001 + WO-UAT-2024-001
  236. INSERT INTO PurOrdMaster (
  237. PurOrd, OrdDate, DueDate, Supp, Potype, Status, SalesOrd, WorkOrd,
  238. Remark, Domain, tenant_id, CreateTime, UpdateTime,
  239. Confirming, Consignment, CommentIndex, CreditTermsInt, Disc, ExchRate,
  240. Sequence, ExchRate1, ExchRate2, FixedPrice, FixedRate, Frt, EMTPO,
  241. MaxAgingDays, PartialOK, AmtPrepaid, PrintPO, ERSPriceListOption,
  242. PST, Recurr, ReleaseFlag, Rel, Revision, Scheduled, Taxable,
  243. BusinessID, IsActive, IsConfirm, IsChanged, TaxIn, Rev
  244. )
  245. VALUES (
  246. 'PO-UAT-001', @now, DATE_ADD(@now, INTERVAL 21 DAY), 'VEN00060', 'PT', 'O',
  247. 'MPO482024102300001', 'WO-UAT-2024-001',
  248. CONCAT('UAT:', @batch_no), CAST(@factory_id AS CHAR), @tenant_id, @now, @now,
  249. 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  250. );
  251. INSERT INTO PurOrdDetail (
  252. PurOrd, Line, ItemNum, QtyOrded, DueDate, PurCost, Status,
  253. Domain, tenant_id, CreateTime, UpdateTime,
  254. QtyBO, CommentIndex, Consignment, CreditTermsInt, Disc, Op, ProjectLine,
  255. ERSPriceListOption, ReqLine, Rel, NextReleaseID, PrimarySOLine,
  256. Scheduled, ScheduledChanged, SchedMRPReq, ShipSchedWeeks, StdCost,
  257. Taxable, TaxIn, MaxTaxableAmt, TransportHours, UMConversion, VAT,
  258. BusinessID, IsActive, IsConfirm, Potype, IsChanged, TaxRate,
  259. IsRounding, ReceiptQty, BarCodeQty, IsClosed, QtyReturnedRefund, CumQtyBO,
  260. PurOrdRecID
  261. )
  262. VALUES
  263. ('PO-UAT-001', 1, 'RAW-M1', 200, DATE_ADD(@now, INTERVAL 14 DAY), 10, 'O',
  264. CAST(@factory_id AS CHAR), @tenant_id, @now, @now,
  265. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'PT',0,0,0,0,0,0,0,0,0,0),
  266. ('PO-UAT-001', 2, 'RAW-M2', 100, DATE_ADD(@now, INTERVAL 14 DAY), 10, 'O',
  267. CAST(@factory_id AS CHAR), @tenant_id, @now, @now,
  268. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'PT',0,0,0,0,0,0,0,0,0,0);
  269. -- 4.3 交货计划 srm_polist_ds(ponumber 指向 PurOrd)
  270. INSERT INTO srm_polist_ds (
  271. Id, domain, icdsid, dsnum, status, itemnum, um, purgroup,
  272. suppliercode, supplier, ponumber, poline, schedqty, needdate, tenant_id
  273. )
  274. VALUES
  275. (@id_base+501, CAST(@factory_id AS CHAR), @id_base+501, 'DS-UAT-001', 'P',
  276. 'RAW-M1', 'EA', 'PG01', 'VEN00060', '供应商A', 'PO-UAT-001', 1, 200, DATE_ADD(@now, INTERVAL 14 DAY), @tenant_id),
  277. (@id_base+502, CAST(@factory_id AS CHAR), @id_base+502, 'DS-UAT-002', 'P',
  278. 'RAW-M2', 'EA', 'PG01', 'VEN00060', '供应商A', 'PO-UAT-001', 2, 100, DATE_ADD(@now, INTERVAL 14 DAY), @tenant_id);
  279. */
  280. -- -----------------------------------------------------------------------------
  281. -- Section 5:S4 交货 / 发货 / 退货(必须来源于 S3 采购订单)
  282. -- -----------------------------------------------------------------------------
  283. /*
  284. -- 5.1 供应商发货 scm_shd / scm_shdzb(po_billno = PurOrd)
  285. -- 注:scm_shd 表结构以 UAT 实库为准(可能无 tenant_id 列)
  286. INSERT INTO scm_shd (
  287. id, po_billno, shddh, sh_purchase_num, sh_purchase_name,
  288. estimated_delivery_date, tjrxm, tjrq
  289. )
  290. VALUES (
  291. @id_base+601, 'PO-UAT-001', 'SH-UAT-001', 'VEN00060', '供应商A',
  292. DATE_ADD(@now, INTERVAL 7 DAY), @operator_name, DATE_FORMAT(@now,'%Y-%m-%d')
  293. );
  294. INSERT INTO scm_shdzb (
  295. id, glid, sh_material_code, sh_material_name,
  296. sh_delivery_quantity, po_bill, po_line
  297. )
  298. VALUES
  299. (@id_base+701, CAST(@id_base+601 AS CHAR), 'RAW-M1', '原料M1', 200, 'PO-UAT-001', '1'),
  300. (@id_base+702, CAST(@id_base+601 AS CHAR), 'RAW-M2', '原料M2', 100, 'PO-UAT-001', '2');
  301. -- 5.2 采购退货 PurOrdRctMaster(OrdNbr 指向 PurOrd;IQC 不合格样例)
  302. INSERT INTO PurOrdRctMaster (
  303. Receiver, OrdNbr, Supp, RctDate, Status, Remark, tenant_id, CreateTime
  304. )
  305. VALUES (
  306. 'RT-UAT-001', 'PO-UAT-001', 'VEN00060', @now, 'O',
  307. CONCAT('UAT IQC退货:', @batch_no), @tenant_id, @now
  308. );
  309. */
  310. -- -----------------------------------------------------------------------------
  311. -- Section 6:导入后串联验收 SQL(只读,导入完成后执行)
  312. -- -----------------------------------------------------------------------------
  313. -- 6.1 租户合规:不得出现 Demo 租户新数据
  314. SELECT 'crm_seorder_demo' AS chk, COUNT(*) AS cnt
  315. FROM crm_seorder
  316. WHERE tenant_id = @tenant_demo
  317. AND bill_from LIKE CONCAT('UAT导入:', @batch_no, '%');
  318. -- 6.2 S1→S2:每单明细至少 1 工单
  319. SELECT so.bill_no,
  320. COUNT(DISTINCT se.Id) AS line_cnt,
  321. COUNT(DISTINCT mo.Id) AS morder_cnt
  322. FROM crm_seorder so
  323. JOIN crm_seorderentry se
  324. ON se.seorder_id = so.Id AND se.tenant_id = @tenant_aidop AND se.IsDeleted = 0
  325. LEFT JOIN mes_moentry me
  326. ON me.soentry_id = se.Id AND me.tenant_id = @tenant_aidop AND me.IsDeleted = 0
  327. LEFT JOIN mes_morder mo
  328. ON mo.Id = me.moentry_moid AND mo.tenant_id = @tenant_aidop AND mo.IsDeleted = 0
  329. WHERE so.tenant_id = @tenant_aidop
  330. AND so.bill_from LIKE CONCAT('UAT导入:', @batch_no, '%')
  331. GROUP BY so.bill_no;
  332. -- 6.3 S2→S3:工单能找到采购申请
  333. SELECT mo.morder_no, COUNT(pr.voucher) AS pr_cnt
  334. FROM mes_morder mo
  335. LEFT JOIN srm_pr_main pr
  336. ON pr.pr_purchasenumber = mo.morder_no AND pr.tenant_id = @tenant_aidop
  337. WHERE mo.tenant_id = @tenant_aidop
  338. AND mo.morder_no LIKE 'WO-UAT-%'
  339. GROUP BY mo.morder_no;
  340. -- 6.4 S3→S4:采购订单能找到发货单(scm_shd 当前无 tenant_id,按 po_billno 关联)
  341. SELECT pom.PurOrd, COUNT(sh.id) AS ship_cnt
  342. FROM PurOrdMaster pom
  343. LEFT JOIN scm_shd sh ON sh.po_billno = pom.PurOrd
  344. WHERE pom.tenant_id = @tenant_aidop
  345. AND pom.Remark LIKE CONCAT('%', @batch_no, '%')
  346. GROUP BY pom.PurOrd;
  347. -- 6.5 KPI 探针(MDP 跑批后)
  348. SELECT module_code, metric_code, COUNT(*) AS rows_count, MAX(biz_date) AS latest_biz_date
  349. FROM ado_s9_kpi_value_l1_day
  350. WHERE module_code IN ('S1','S2','S3','S4')
  351. AND is_deleted = 0
  352. GROUP BY module_code, metric_code
  353. ORDER BY module_code, metric_code;