Blame view

项目文档相关/sql/2026-07-30/补挂金三角业绩_jsjid_202607_v2_分批.sql 11.6 KB
c4040263   “wangming”   feat: V2.0.2 会员标签...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
  -- =============================================================================
  -- 补挂金三角业绩 jsj_id / F_jsjid20267月)— V2 分批版【全公司】
  -- =============================================================================
  -- 范围说明(生产数据迁库后 2026-07-30 核对):
  --   - 7 月未挂:开单约 3339、耗卡约 3638(含大量「当月无战队绑定」历史行,勿全量盲补)
  --   - 本脚本可安全补挂:开单 319、耗卡 891(当月有 ACTIVE 绑定且 jsj_id 为空)
  --   - 虎啸龙吟仍待补:开单 3 + 耗卡 13 = 16 条(步骤 2 可先秒级验证)
  --
  -- 适用场景:
  --   全量 UPDATE + 关联子查询易触发 2013 Lost connection,本脚本改为:
  --   1) 先建「健康师→战队」映射临时表(只算一次)
  --   2) 每次 UPDATE LIMIT 100,可反复执行直到影响 0 
  --   3) 仅补空值,不覆盖已有 jsj_id(支持跨战队、支持断点续跑)
  --
  -- 执行建议(Navicat / DBeaver):
  --   - 不要一次运行整个文件;按「步骤」分段选中执行
  --   - 执行前可先跑:SET SESSION net_read_timeout = 600;
  --   - 步骤 C/D 重复执行同一段,直到「影响行数 = 0
  -- =============================================================================
  
  SET NAMES utf8mb4;
  
  -- 可选:拉长会话超时,减少 2013
  SET SESSION net_read_timeout = 600;
  SET SESSION net_write_timeout = 600;
  SET SESSION wait_timeout = 600;
  SET SESSION innodb_lock_wait_timeout = 120;
  
  SET @month_start = '2026-07-01 00:00:00';
  SET @month_end   = '2026-07-31 23:59:59';
  SET @perf_month  = '202607';
  SET @huxiao_jsj  = '841830228446676229'; -- 虎啸龙吟
  
  -- =============================================================================
  -- 步骤 0:断点检查(看上次是否已部分执行)
  -- =============================================================================
  SELECT 'bak_kd' AS item, COUNT(*) AS cnt
  FROM information_schema.TABLES
  WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bak_kd_jksyj_jsjid_202607'
  UNION ALL
  SELECT 'bak_xh', COUNT(*)
  FROM information_schema.TABLES
  WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bak_xh_jksyj_jsjid_202607';
  
  -- 虎啸龙吟三人 16 条关键行状态(空=未补,有值=已补)
  SELECT 'kd' AS typ, k.F_Id, k.jksxm, k.jsj_id
  FROM lq_kd_jksyj k
  WHERE k.F_Id IN (
    '849792273540449542','852022282741089541','852022282741089542'
  )
  UNION ALL
  SELECT 'xh', x.F_Id, x.jksxm, x.F_jsjid
  FROM lq_xh_jksyj x
  WHERE x.F_Id IN (
    '843749838901216517','843749838901216518','844872313659720965',
    '846897478727894277','846652670822319365','846692856495080709',
    '848020321473660165','848553719795549445','849587037194421509',
    '850906583914251525','851690507896620293','851690507900814597',
    '851690507905008901'
  );
  
  -- =============================================================================
  -- 步骤 1:备份(仅未挂行,很快;若已存在可跳过)
  -- =============================================================================
  CREATE TABLE IF NOT EXISTS bak_kd_jksyj_jsjid_202607 (
    F_Id          VARCHAR(64)  NOT NULL,
    glkdbh        VARCHAR(64)  NULL,
    jks           VARCHAR(64)  NULL,
    jkszh         VARCHAR(64)  NULL,
    jksxm         VARCHAR(128) NULL,
    yjsj          DATETIME     NULL,
    jsj_id        VARCHAR(64)  NULL,
    F_IsEffective INT          NULL,
    PRIMARY KEY (F_Id)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  
  CREATE TABLE IF NOT EXISTS bak_xh_jksyj_jsjid_202607 (
    F_Id          VARCHAR(64)  NOT NULL,
    glkdbh        VARCHAR(64)  NULL,
    jks           VARCHAR(64)  NULL,
    jkszh         VARCHAR(64)  NULL,
    jksxm         VARCHAR(128) NULL,
    yjsj          DATETIME     NULL,
    F_jsjid       VARCHAR(64)  NULL,
    F_IsEffective INT          NULL,
    PRIMARY KEY (F_Id)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  
  INSERT IGNORE INTO bak_kd_jksyj_jsjid_202607
  SELECT k.F_Id, k.glkdbh, k.jks, k.jkszh, k.jksxm, k.yjsj, k.jsj_id, k.F_IsEffective
  FROM lq_kd_jksyj k
  WHERE k.F_IsEffective = 1
    AND (k.jsj_id IS NULL OR k.jsj_id = '')
    AND k.yjsj >= @month_start
    AND k.yjsj <= @month_end;
  
  INSERT IGNORE INTO bak_xh_jksyj_jsjid_202607
  SELECT x.F_Id, x.glkdbh, x.jks, x.jkszh, x.jksxm, x.yjsj, x.F_jsjid, x.F_IsEffective
  FROM lq_xh_jksyj x
  WHERE x.F_IsEffective = 1
    AND (x.F_jsjid IS NULL OR x.F_jsjid = '')
    AND x.yjsj >= @month_start
    AND x.yjsj <= @month_end;
  
  -- =============================================================================
  -- 步骤 2:虎啸龙吟三人 16 条(秒级完成,建议先跑这段)
  --         跨战队单 849167374304150789:只补唐宇欣,不动柳全菊
  -- =============================================================================
  UPDATE lq_kd_jksyj
  SET jsj_id = @huxiao_jsj
  WHERE F_Id IN (
    '849792273540449542',
    '852022282741089541',
    '852022282741089542'
  )
    AND F_IsEffective = 1
    AND (jsj_id IS NULL OR jsj_id = '');
  
  UPDATE lq_xh_jksyj
  SET F_jsjid = @huxiao_jsj
  WHERE F_Id IN (
    '843749838901216517','843749838901216518','844872313659720965',
    '846897478727894277','846652670822319365','846692856495080709',
    '848020321473660165','848553719795549445','849587037194421509',
    '850906583914251525','851690507896620293','851690507900814597',
    '851690507905008901'
  )
    AND F_IsEffective = 1
    AND (F_jsjid IS NULL OR F_jsjid = '');
  
  -- =============================================================================
  -- 步骤 3:构建映射表 tmp_jsj_user_bind_202607(全公司 7 月,每人一条)
  -- =============================================================================
  DROP TABLE IF EXISTS tmp_jsj_user_bind_202607;
  
  CREATE TABLE tmp_jsj_user_bind_202607 (
    user_id   VARCHAR(64) NOT NULL,
    jsj_id    VARCHAR(64) NOT NULL,
    team_name VARCHAR(128) NULL,
    PRIMARY KEY (user_id),
    KEY idx_jsj_id (jsj_id)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  
  INSERT INTO tmp_jsj_user_bind_202607 (user_id, jsj_id, team_name)
  SELECT
    x.user_id,
    MIN(x.jsj_id) AS jsj_id,
    MIN(j.jsj)    AS team_name
  FROM (
    SELECT ju.user_id, ju.jsj_id
    FROM lq_jinsanjiao_user ju
    INNER JOIN (
      SELECT user_id, MAX(F_CreatorTime) AS max_ct
      FROM lq_jinsanjiao_user
      WHERE F_DeleteMark = 0
        AND status = 'ACTIVE'
        AND F_Month = @perf_month
        AND jsj_id IS NOT NULL
        AND jsj_id <> ''
      GROUP BY user_id
    ) latest
      ON latest.user_id = ju.user_id
     AND latest.max_ct = ju.F_CreatorTime
    INNER JOIN lq_ycsd_jsj j0
      ON j0.F_Id = ju.jsj_id
     AND j0.yf = ju.F_Month
    WHERE ju.F_DeleteMark = 0
      AND ju.status = 'ACTIVE'
      AND ju.F_Month = @perf_month
      AND ju.jsj_id IS NOT NULL
      AND ju.jsj_id <> ''
  ) x
  INNER JOIN lq_ycsd_jsj j ON j.F_Id = x.jsj_id
  GROUP BY x.user_id;
  
  -- 映射表行数预览(应有当月绑定健康师人数)
  SELECT COUNT(*) AS bind_user_cnt FROM tmp_jsj_user_bind_202607;
  
  -- =============================================================================
  -- 步骤 4:待补数量(执行前后对比用)
  -- =============================================================================
  SELECT 'kd_todo' AS typ, COUNT(*) AS cnt
  FROM lq_kd_jksyj k
  INNER JOIN tmp_jsj_user_bind_202607 b
    ON b.user_id = COALESCE(NULLIF(TRIM(k.jkszh), ''), NULLIF(TRIM(k.jks), ''))
  WHERE k.F_IsEffective = 1
    AND (k.jsj_id IS NULL OR k.jsj_id = '')
    AND k.yjsj >= @month_start
    AND k.yjsj <= @month_end
  UNION ALL
  SELECT 'xh_todo', COUNT(*)
  FROM lq_xh_jksyj x
  INNER JOIN tmp_jsj_user_bind_202607 b
    ON b.user_id = COALESCE(NULLIF(TRIM(x.jkszh), ''), NULLIF(TRIM(x.jks), ''))
  WHERE x.F_IsEffective = 1
    AND (x.F_jsjid IS NULL OR x.F_jsjid = '')
    AND x.yjsj >= @month_start
    AND x.yjsj <= @month_end;
  
  -- =============================================================================
  -- 步骤 5C:分批补开单(每次 100  —— 重复执行本段直到影响 0 行)
  -- =============================================================================
  UPDATE lq_kd_jksyj k
  INNER JOIN (
    SELECT k2.F_Id, b2.jsj_id
    FROM lq_kd_jksyj k2
    INNER JOIN tmp_jsj_user_bind_202607 b2
      ON b2.user_id = COALESCE(NULLIF(TRIM(k2.jkszh), ''), NULLIF(TRIM(k2.jks), ''))
    WHERE k2.F_IsEffective = 1
      AND (k2.jsj_id IS NULL OR k2.jsj_id = '')
      AND k2.yjsj >= @month_start
      AND k2.yjsj <= @month_end
    ORDER BY k2.F_Id
    LIMIT 100
  ) batch ON batch.F_Id = k.F_Id
  SET k.jsj_id = batch.jsj_id;
  
  -- 查看还剩多少(应为 0 才停)
  SELECT COUNT(*) AS kd_remain
  FROM lq_kd_jksyj k
  INNER JOIN tmp_jsj_user_bind_202607 b
    ON b.user_id = COALESCE(NULLIF(TRIM(k.jkszh), ''), NULLIF(TRIM(k.jks), ''))
  WHERE k.F_IsEffective = 1
    AND (k.jsj_id IS NULL OR k.jsj_id = '')
    AND k.yjsj >= @month_start
    AND k.yjsj <= @month_end;
  
  -- =============================================================================
  -- 步骤 5D:分批补耗卡(每次 100  —— 重复执行本段直到影响 0 行)
  -- =============================================================================
  UPDATE lq_xh_jksyj x
  INNER JOIN (
    SELECT x2.F_Id, b2.jsj_id
    FROM lq_xh_jksyj x2
    INNER JOIN tmp_jsj_user_bind_202607 b2
      ON b2.user_id = COALESCE(NULLIF(TRIM(x2.jkszh), ''), NULLIF(TRIM(x2.jks), ''))
    WHERE x2.F_IsEffective = 1
      AND (x2.F_jsjid IS NULL OR x2.F_jsjid = '')
      AND x2.yjsj >= @month_start
      AND x2.yjsj <= @month_end
    ORDER BY x2.F_Id
    LIMIT 100
  ) batch ON batch.F_Id = x.F_Id
  SET x.F_jsjid = batch.jsj_id;
  
  SELECT COUNT(*) AS xh_remain
  FROM lq_xh_jksyj x
  INNER JOIN tmp_jsj_user_bind_202607 b
    ON b.user_id = COALESCE(NULLIF(TRIM(x.jkszh), ''), NULLIF(TRIM(x.jks), ''))
  WHERE x.F_IsEffective = 1
    AND (x.F_jsjid IS NULL OR x.F_jsjid = '')
    AND x.yjsj >= @month_start
    AND x.yjsj <= @month_end;
  
  -- =============================================================================
  -- 步骤 6:验证(虎啸龙吟 7 月)
  -- =============================================================================
  SELECT j.jsj AS team_name, SUM(CAST(k.jksyj AS DECIMAL(18,2))) AS billing_total
  FROM lq_kd_jksyj k
  LEFT JOIN lq_ycsd_jsj j ON j.F_Id = k.jsj_id
  WHERE k.jsj_id = @huxiao_jsj
    AND k.F_IsEffective = 1
    AND k.yjsj >= @month_start AND k.yjsj <= @month_end
    AND k.jksyj IS NOT NULL AND k.jksyj <> '' AND k.jksyj <> '0';
  
  -- 预期 billing_total(生产迁库后):120756.00(修复前约 115576 + 待补 5180
  
  SELECT k.jksxm, SUM(CAST(k.jksyj AS DECIMAL(18,2))) AS billing_amt
  FROM lq_kd_jksyj k
  WHERE k.jsj_id = @huxiao_jsj
    AND k.F_IsEffective = 1
    AND k.yjsj >= @month_start AND k.yjsj <= @month_end
    AND k.jksyj IS NOT NULL AND k.jksyj <> '' AND k.jksyj <> '0'
  GROUP BY k.jksxm ORDER BY billing_amt DESC;
  
  SELECT x.jksxm, SUM(x.jksyj) AS consume_amt
  FROM lq_xh_jksyj x
  WHERE x.F_jsjid = @huxiao_jsj
    AND x.F_IsEffective = 1
    AND x.yjsj >= @month_start AND x.yjsj <= @month_end
    AND x.jksyj IS NOT NULL AND x.jksyj <> 0
  GROUP BY x.jksxm ORDER BY consume_amt DESC;
  -- 预期 consume 合计(生产迁库后):84469.49(修复前约 78920.31 + 待补 5549.18
  
  -- 跨战队单:柳全菊=卧虎藏龙,唐宇欣=虎啸龙吟
  SELECT k.jksxm, k.jsj_id, j.jsj
  FROM lq_kd_jksyj k
  LEFT JOIN lq_ycsd_jsj j ON j.F_Id = k.jsj_id
  WHERE k.glkdbh = '849167374304150789' AND k.F_IsEffective = 1;
  
  -- =============================================================================
  -- 步骤 7:清理临时表(验证通过后)
  -- =============================================================================
  -- DROP TABLE IF EXISTS tmp_jsj_user_bind_202607;
  
  -- =============================================================================
  -- 回滚(慎用,按备份表恢复)
  -- =============================================================================
  -- UPDATE lq_kd_jksyj k
  -- INNER JOIN bak_kd_jksyj_jsjid_202607 b ON b.F_Id = k.F_Id
  -- SET k.jsj_id = b.jsj_id;
  --
  -- UPDATE lq_xh_jksyj x
  -- INNER JOIN bak_xh_jksyj_jsjid_202607 b ON b.F_Id = x.F_Id
  -- SET x.F_jsjid = b.F_jsjid;