如何将A表的字段名转换成值填充到B表

如何将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里

img

使用存储过程和动态语句实现了,在数据字典取字段值。加点 悬赏吧 。

img

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

img

参考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 语句的示例,具体实现可能因为不同数据库的差异而有所不同。请根据您所使用的数据库和实际情况进行调整。