纵表和横表的相互转换

文章展示了两个数据库表,一个是`material_info_1678183618765`,存储物资基本信息,包括ID、类型、属性值等;另一个是`material_dict_data`,包含物资字典数据,如代码、标签、类型等。表中各字段均有详细注释。此外,还提供了一个SQL查询示例,将物资信息从竖表转为横表,以便于数据分析。

竖表结构

CREATE TABLE "public"."material_info_1678183618765" (
  "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL,
  "mat_id" varchar(255) COLLATE "pg_catalog"."default",
  "material_type" varchar(255) COLLATE "pg_catalog"."default",
  "data_id" varchar(255) COLLATE "pg_catalog"."default",
  "values" varchar(255) COLLATE "pg_catalog"."default",
  "remark" varchar(255) COLLATE "pg_catalog"."default",
  "create_time" timestamp(6) DEFAULT CURRENT_TIMESTAMP,
  "create_by" varchar(64) COLLATE "pg_catalog"."default",
  "update_time" timestamp(6) DEFAULT CURRENT_TIMESTAMP,
  "update_by" varchar(64) COLLATE "pg_catalog"."default",
  "del_flag" char(1) COLLATE "pg_catalog"."default",
  "tenant_id" int8
)
;

ALTER TABLE "public"."material_info_1678183618765" 
  OWNER TO "postgres";

COMMENT ON COLUMN "public"."material_info_1678183618765"."id" IS '主键';

COMMENT ON COLUMN "public"."material_info_1678183618765"."mat_id" IS '物资表主键';

COMMENT ON COLUMN "public"."material_info_1678183618765"."material_type" IS '物资类型';

COMMENT ON COLUMN "public"."material_info_1678183618765"."data_id" IS '物资属性id';

COMMENT ON COLUMN "public"."material_info_1678183618765"."values" IS '物资属性值';

COMMENT ON COLUMN "public"."material_info_1678183618765"."remark" IS '备注';

COMMENT ON COLUMN "public"."material_info_1678183618765"."create_time" IS '创建时间';

COMMENT ON COLUMN "public"."material_info_1678183618765"."create_by" IS '创建人';

COMMENT ON COLUMN "public"."material_info_1678183618765"."update_time" IS '修改时间';

COMMENT ON COLUMN "public"."material_info_1678183618765"."update_by" IS '修改人';

COMMENT ON COLUMN "public"."material_info_1678183618765"."del_flag" IS '是否删除(0-否;1-是)';

COMMENT ON COLUMN "public"."material_info_1678183618765"."tenant_id" IS '租户ID';

数据字典表结构

CREATE TABLE "public"."material_dict_data" (
  "material_code" varchar(64) COLLATE "pg_catalog"."default" NOT NULL,
  "material_sort" int4,
  "material_label" varchar(100) COLLATE "pg_catalog"."default",
  "material_value" varchar(100) COLLATE "pg_catalog"."default",
  "material_type" varchar(100) COLLATE "pg_catalog"."default",
  "is_import" char(1) COLLATE "pg_catalog"."default",
  "status" char(1) COLLATE "pg_catalog"."default",
  "create_by" varchar(64) COLLATE "pg_catalog"."default",
  "create_time" timestamp(6),
  "update_by" varchar(64) COLLATE "pg_catalog"."default",
  "update_time" timestamp(6),
  "remark" varchar(500) COLLATE "pg_catalog"."default",
  "del_flag" char(1) COLLATE "pg_catalog"."default",
  "is_public" char(1) COLLATE "pg_catalog"."default",
  "input_type" varchar(64) COLLATE "pg_catalog"."default",
  "is_validate" char(1) COLLATE "pg_catalog"."default",
  "tenant_id" int8,
  "dict_type" json
)
;

ALTER TABLE "public"."material_dict_data" 
  OWNER TO "postgres";

COMMENT ON COLUMN "public"."material_dict_data"."material_code" IS '主键';

COMMENT ON COLUMN "public"."material_dict_data"."material_sort" IS '排序值';

COMMENT ON COLUMN "public"."material_dict_data"."material_label" IS '物资标签';

COMMENT ON COLUMN "public"."material_dict_data"."material_value" IS '物资键值';

COMMENT ON COLUMN "public"."material_dict_data"."material_type" IS '物资类型';

COMMENT ON COLUMN "public"."material_dict_data"."is_import" IS '是否导入字段(0-否;1-是)';

COMMENT ON COLUMN "public"."material_dict_data"."status" IS '状态(0-启用;1-停用)';

COMMENT ON COLUMN "public"."material_dict_data"."create_by" IS '创建人';

COMMENT ON COLUMN "public"."material_dict_data"."create_time" IS '创建时间';

COMMENT ON COLUMN "public"."material_dict_data"."update_by" IS '修改人';

COMMENT ON COLUMN "public"."material_dict_data"."update_time" IS '修改时间';

COMMENT ON COLUMN "public"."material_dict_data"."remark" IS '备注';

COMMENT ON COLUMN "public"."material_dict_data"."del_flag" IS '是否删除(0-否;1-是)';

COMMENT ON COLUMN "public"."material_dict_data"."is_public" IS '是否公共配置(0-否;1-是)';

COMMENT ON COLUMN "public"."material_dict_data"."input_type" IS '输入类型';

COMMENT ON COLUMN "public"."material_dict_data"."is_validate" IS '是否验证(0-否;1-是)';

COMMENT ON COLUMN "public"."material_dict_data"."tenant_id" IS '租户ID';

COMMENT ON COLUMN "public"."material_dict_data"."dict_type" IS '下拉列表字典类型';

COMMENT ON TABLE "public"."material_dict_data" IS '物资参数表';

竖表转横表

SELECT
    i.mat_id,
    ( string_agg ( CASE d.material_value WHEN 'oldMatNo' THEN i.values ELSE '' END,'' ) )  AS oldMatNo,
    ( string_agg ( CASE d.material_value WHEN 'enterPort' THEN i.values ELSE '' END,'' ) )  AS enterPort,
    ( string_agg ( CASE d.material_value WHEN 'needPrint' THEN i.values ELSE '' END,'' ) )  AS needPrint,
    ( string_agg ( CASE d.material_value WHEN 'centraPurch' THEN i.values ELSE '' END,'' ) )  AS centraPurch,
    ( string_agg ( CASE d.material_value WHEN 'qualityIO' THEN i.values ELSE '' END,'' ) )  AS qualityIO,
    ( string_agg ( CASE d.material_value WHEN 'purTeam' THEN i.values ELSE '' END,'' ) )  AS purTeam,
    ( string_agg ( CASE d.material_value WHEN 'purCycle' THEN i.values ELSE '' END,'' ) )  AS purCycle,
    ( string_agg ( CASE d.material_value WHEN 'blueprint' THEN i.values ELSE '' END,'' ) )  AS blueprint
FROM
    material_info_1678183618765 i
LEFT JOIN material_dict_data d on d.material_code = i.data_id and d.material_type = i.material_type
GROUP BY 
    i.mat_id

在MySQL中,将横表转换为纵有多种方法可以实现。一种常见的方法是使用聚合函数CASE语句。可以使用CASE语句将原始中的列值转换为新的列,并使用聚合函数将这些新列进行分组计算。以下是一个示例查询,演示如何将横表转换为纵: ``` SELECT id, MAX(CASE WHEN column_name = 'column_1' THEN column_value END) AS column_1, MAX(CASE WHEN column_name = 'column_2' THEN column_value END) AS column_2, MAX(CASE WHEN column_name = 'column_3' THEN column_value END) AS column_3 FROM horizontal_table GROUP BY id; ``` 在上面的查询中,假设`horizontal_table`为原始的横表,其中包含`id`作为主键,`column_name`示列名,`column_value`示列值。通过使用CASE语句,我们将每个列名对应的列值转换为新的列。MAX聚合函数用于将同一行中的多个列值合并成一行。最后使用GROUP BY子句对id进行分组,以确保每个id只有一行。 这样,就可以将横表转换为纵,并将每个列名作为新的列。需要注意的是,转换后的纵可能会有空值,因为某些id可能没有对应的列值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL横表相互转换](https://blog.youkuaiyun.com/wzyyc/article/details/78039681)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Mysql横表](https://blog.youkuaiyun.com/qq_38140292/article/details/124099505)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值