You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多表关联SQL查询结果从纵向表转为横向表的实现方法咨询

问题描述

我拥有以下三张数据表:

1. 表:tblAttribute

Id(编号)attribute(属性)dcControl(控制项)
1LowTv
2fastNozzle
3LowNOxPAR_LOW_NOX_ENG_ENABLE
4TCCutOff
5WHR
6gtd311
7none

2. 表:tblTuning

id(编号)eng_id(引擎编号)legislation(法规标准)tuningMode(调优模式)
11T2Delta
21T1Delta
31T1LLT
41T2LLT
51T2Std
61T1Std
72T2Delta
82T1Delta
92T1LLT
102T2LLT
112T1Std
122T2Std

3. 表:tblTuningMatrix

id(编号)itemID(条目编号)tuningattr_id(调优属性编号)tuningattr_value(调优属性值)
1111
2210
3311
4410
5510

当前关联三张表的查询语句如下:

select tuning.id, tuning.eng_id,
    tuningMatrix.tuningattr_value, tuning.tuningMode,
    tuning.legislation, tuningAttribute.attribute,
    tuningAttribute.dcControl
from tuningMatrix
inner join tuning on tuning.itemId=tuningMatrix.itemID
inner join tuningAttribute on tuningAttribute.id=tuningMatrix.tuningattr_id
WHERE tuning.deleted = 'false'

通过该查询得到纵向结构的结果表,但需要转换为横向结构。实际输出与期望输出如下:

期望输出

id(编号)eng_id(引擎编号)tuningMode(调优模式)legislation(法规标准)dcControl(控制项)LowTvWHRLowNoxTCCutOffgtd311fastNozzle
11DeltaT2null000110

实际输出

id(编号)eng_id(引擎编号)tuningMode(调优模式)legislation(法规标准)dcControl(控制项)LowTvWHRLowNoxTCCutOffgtd311fastNozzle
11DeltaT210NULL000
11DeltaT2PAR_LOW_NOX_ENG_ENABLENULLNULL0NULLNULLNULL
21DeltaT200NULL000
21DeltaT2PAR_LOW_NOX_ENG_ENABLENULLNULL0NULLNULLNULL

请问该如何修改查询语句以实现将结果从纵向表转为横向表的需求?


解决方案

要实现纵向转横向(行转列),可以使用条件聚合(CASE WHEN + 聚合函数)将每个属性转换为单独列,同时按tuning表的唯一标识分组,确保每条tuning记录只显示一行。

修改后的查询语句

SELECT
    t.id AS `id(编号)`,
    t.eng_id AS `eng_id(引擎编号)`,
    t.tuningMode AS `tuningMode(调优模式)`,
    t.legislation AS `legislation(法规标准)`,
    MAX(ta.dcControl) AS `dcControl(控制项)`,
    -- 为每个属性设置列,无对应值时显示0
    COALESCE(MAX(CASE WHEN ta.attribute = 'LowTv' THEN tm.tuningattr_value END), 0) AS LowTv,
    COALESCE(MAX(CASE WHEN ta.attribute = 'WHR' THEN tm.tuningattr_value END), 0) AS WHR,
    COALESCE(MAX(CASE WHEN ta.attribute = 'LowNOx' THEN tm.tuningattr_value END), 0) AS LowNox,
    COALESCE(MAX(CASE WHEN ta.attribute = 'TCCutOff' THEN tm.tuningattr_value END), 0) AS TCCutOff,
    COALESCE(MAX(CASE WHEN ta.attribute = 'gtd311' THEN tm.tuningattr_value END), 0) AS gtd311,
    COALESCE(MAX(CASE WHEN ta.attribute = 'fastNozzle' THEN tm.tuningattr_value END), 0) AS fastNozzle
FROM tblTuning t
LEFT JOIN tblTuningMatrix tm ON t.id = tm.itemID
LEFT JOIN tblAttribute ta ON tm.tuningattr_id = ta.id
WHERE t.deleted = 'false'
GROUP BY t.id, t.eng_id, t.tuningMode, t.legislation

关键说明

  1. LEFT JOIN替代INNER JOIN:确保即使某些tuning记录没有对应的tuningMatrix或attribute数据,也能被保留,避免遗漏记录。
  2. 条件聚合:用CASE WHEN匹配每个属性,结合MAX函数将同一tuning记录的多行属性值合并为一行;COALESCE把NULL值替换为0,贴合期望输出格式。
  3. 分组依据:按tuning表的唯一字段(id、eng_id、tuningMode、legislation)分组,保证每条tuning记录只生成一行结果。
  4. dcControl处理:用MAX(ta.dcControl)取该tuning记录对应的控制项(多值时取非空值),无对应值时显示NULL。

内容的提问来源于stack exchange,提问作者Srusti Thakkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:30:58