如何将A表的字段名转换成值填充到B表,如下图所示想将上面表的字段Px填充到下表做值。
B表的分数1实际上是A表同ID那行的最小值,然后时间1是最小值对应的P
请大家尽量脱离指定命名的思路,我最终使用的方向大概和大家说一下
A表为一个ID数据+96点时刻点数据,也就是一行97个字段
B表为1个ID数据+3个时刻+3个数值,也就是一行7个字段,其中时刻P1对应数值1,以此类推3个时刻点对应A表的96时刻点字段名
现在的主要目的是把表A的时刻也就是字段名转化成值写入B表的时刻123里
使用存储过程和动态语句实现了,在数据字典取字段值。加点 悬赏吧 。
create table mp (id VARCHAR(10),item1 NUMERIC,item2 numeric,item3 numeric,item4 numeric,item5 numeric,item6 numeric,
item7 numeric,item8 numeric,item9 numeric,item10 numeric,item11 numeric,item12 numeric,item13 numeric,item14 numeric,
item15 numeric,item16 numeric,item17 numeric,item18 numeric,item19 numeric,item20 numeric,item21 numeric,item22 numeric,
item23 numeric,item24 numeric,item25 numeric,item26 numeric,item27 numeric,item28 numeric,item29 numeric,item30 numeric
,item31 numeric,item32 numeric,item33 numeric,item34 numeric,item35 numeric,item36 numeric,item37 numeric,item38 numeric,
item39 numeric,item40 numeric,item41 numeric,item42 numeric,item43 numeric,item44 numeric,item45 numeric,item46 numeric,
item47 numeric,item48 numeric,item49 numeric,item50 numeric,item51 numeric,item52 numeric,item53 numeric,item54 numeric,
item55 numeric,item56 numeric,item57 numeric,item58 numeric,item59 numeric,item60 numeric,item61 numeric,item62 numeric,
item63 numeric,item64 numeric,item65 numeric,item66 numeric,item67 numeric,item68 numeric,item69 numeric,item70 numeric,
item71 numeric,item72 numeric,item73 numeric,item74 numeric,item75 numeric,item76 numeric,item77 numeric,item78 numeric,
item79 numeric,item80 numeric,item81 numeric,item82 numeric,item83 numeric,item84 numeric,item85 numeric,item86 numeric,
item87 numeric,item88 numeric,item89 numeric,item90 numeric,item91 numeric,item92 numeric,item93 numeric,item94 numeric,
item95 numeric,item96 numeric);
create table np (id VARCHAR(10),
nitem1 VARCHAR(10),
nitem2 VARCHAR(10),
nitem3 VARCHAR(10),
nv1 numeric,
nv2 numeric,
nv3 numeric);
insert into mp values ('point3',300 ,301 ,302 ,303 ,304 ,305 ,306 ,307 ,308 ,309 ,310 ,311 ,312 ,313 ,314 ,315 ,316 ,317 ,318 ,319 ,320 ,321 ,322 ,323 ,324 ,325 ,326 ,327 ,328 ,329 ,330 ,331 ,332 ,333 ,334 ,335 ,336 ,337 ,338 ,339 ,340 ,341 ,342 ,343 ,344 ,345 ,346 ,347 ,348 ,349 ,350 ,351 ,352 ,353 ,354 ,355 ,356 ,357 ,358 ,359 ,360 ,361 ,362 ,363 ,364 ,365 ,366 ,367 ,368 ,369 ,370 ,371 ,372 ,373 ,374 ,375 ,376 ,377 ,378 ,379 ,380 ,381 ,382 ,383 ,384 ,385 ,386 ,387 ,388 ,389 ,390 ,391 ,392 ,393 ,394 ,395 );
insert into mp values ('point2',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 );
insert into mp values ('point1',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 );
commit;
```bash
该回答引用ChatGPT
如有疑问,可以回复我!
请测试
此查询使用UNION子句将两个SELECT语句的结果合并为一个结果集。第一个SELECT语句将A表的P1、P2和P3字段的值作为B表的分数1、分数2和分数3字段的值插入。第二个SELECT语句将A表的P4和P5字段的值插入B表的分数1和分数2字段中,并将B表的时间1和时间2字段设置为P4和P5。请注意,时间3字段在第二个SELECT语句中为空,分数3字段为0。
INSERT INTO B (ID, 时间1, 时间2, 时间3, 分数1, 分数2, 分数3)
SELECT ID, 'P1' AS 时间1, 'P2' AS 时间2, 'P3' AS 时间3, P1 AS 分数1, P2 AS 分数2, P3 AS 分数3 FROM A
UNION
SELECT ID, 'P4' AS 时间1, 'P5' AS 时间2, '' AS 时间3, P4 AS 分数1, P5 AS 分数2, 0 AS 分数3 FROM A;
可以通过拼接字段名构成sql去查询。
mssql实现这个很简单,mysql就。。。
mssql 实现
with t as (
select 'a' id,56 p1,57 p2,58 p3,59 p4,60 p5
union all select 'b',61,60,59,58,57
),t1 as (
select *,row_number() over(partition by id order by val) sortid
from t
unpivot (val for col in (p1,p2,p3,p4,p5)) p
),t2 as (
select *
from t1
--unpivot(f1 for f in (col,val)) p
)
select *
from (
select * from (select id,val,'分数' + convert(varchar,sortid) f from t2) a
pivot(max(val) for f in (分数1,分数2,分数3)) p
) a
left join (
select * from (select id,col,'时间' + convert(varchar,sortid) f from t2) a
pivot(max(col) for f in (时间1,时间2,时间3)) p
) b on a.id=b.id
参考GPT和自己的思路,假设A表的名称为 table_A,B表的名称为 table_B,则可以使用以下SQL语句来实现:
INSERT INTO table_B (时间1, 时间2, 时间3, ..., 时间N, 分数1, 分数2, 分数3, ..., 分数N)
SELECT
MIN(CASE WHEN column_name = 'P1' THEN column_name END) AS 时间1,
MIN(CASE WHEN column_name = 'P2' THEN column_name END) AS 时间2,
MIN(CASE WHEN column_name = 'P3' THEN column_name END) AS 时间3,
...,
MIN(CASE WHEN column_name = 'PN' THEN column_name END) AS 时间N,
MIN(P1) AS 分数1,
MIN(P2) AS 分数2,
MIN(P3) AS 分数3,
...,
MIN(PN) AS 分数N
FROM
table_A
GROUP BY
ID;
此SQL语句首先使用 CASE WHEN 条件语句将A表的字段名转换为对应的时间值(例如P1转换为时间1),然后使用 MIN 聚合函数将同一个ID的记录中对应的最小值填入B表的分数列中。
如有其他疑问请回复我,回答不易,还请采纳!!!
分数列是固定的吗?B表中分数二取什么数据?问题描述的不够详细
SELECT
tb3.id AS ID,
SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 2), ',', - 1) AS '时间1',
SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 4), ',', - 1) AS '时间2',
SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 6), ',', - 1) AS '时间3',
SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 1), ',', - 1) AS '分数1',
SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 3), ',', - 1) AS '分数2',
SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 5), ',', - 1) AS '分数3'
FROM
(SELECT
tb2.id,
SUBSTRING_INDEX(GROUP_CONCAT(CONCAT(tb2.分数, ',', tb2.时间)
ORDER BY tb2.分数 ASC), ',', 6) AS data
FROM
(SELECT
id, p1 分数, 'p1' 时间
FROM
tb1 UNION SELECT
id, p2 分数, 'p2' 时间
FROM
tb1 UNION SELECT
id, p3 分数, 'p3' 时间
FROM
tb1 UNION SELECT
id, p4 分数, 'p4' 时间
FROM
tb1 UNION SELECT
id, p5 分数, 'p5' 时间
FROM
tb1) tb2
GROUP BY id) tb3
首先,使用 SQL 语句查询 A 表中指定 ID 的所有字段名和对应的值,可以使用如下语句:
SELECT * FROM A WHERE ID = '指定的ID';
这会返回一个包含指定 ID 的所有字段名和对应的值的结果集。
接下来,您需要使用 SQL 语句将这些字段名转换成对应的值并插入到 B 表中。可以使用如下语句:
INSERT INTO B (ID, Time1, Score1, Time2, Score2, Time3, Score3)
SELECT ID,
MIN(CASE WHEN Px = 'Time1' THEN Value END) AS Time1,
MIN(CASE WHEN Px = 'Score1' THEN Value END) AS Score1,
MIN(CASE WHEN Px = 'Time2' THEN Value END) AS Time2,
MIN(CASE WHEN Px = 'Score2' THEN Value END) AS Score2,
MIN(CASE WHEN Px = 'Time3' THEN Value END) AS Time3,
MIN(CASE WHEN Px = 'Score3' THEN Value END) AS Score3
FROM A
WHERE ID = '指定的ID'
GROUP BY ID;
这会将指定 ID 的每个字段名对应的值填充到 B 表中对应的字段中,其中 Score1 的值为 A 表中指定 ID 行中 Px 字段的最小值,Time1 的值为对应的时刻点。
注意,这是一个基于 SQL 语句的示例,具体实现可能因为不同数据库的差异而有所不同。请根据您所使用的数据库和实际情况进行调整。