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

MySQL多行列转行查询:基于关联表聚合多行数据

实现MySQL查询合并多行数据为单行

嘿,作为SQL新手能提出这样的需求已经很赞啦!针对你的场景,我们可以通过两次关联Quote_ws表+条件拼接字符串来实现想要的效果,下面是具体的解决方案:

完整SQL查询语句

SELECT
    st.section_id,
    st.quote_id,
    -- 拼接gross字段,处理non_lsb为空的情况
    CASE
        WHEN st.non_lsb IS NULL THEN q_lsb.gross
        ELSE CONCAT(q_lsb.gross, ' + ', q_nonlsb.gross)
    END AS gross,
    -- 拼接tax字段,处理non_lsb为空的情况
    CASE
        WHEN st.non_lsb IS NULL THEN q_lsb.tax
        ELSE CONCAT(q_lsb.tax, '+', q_nonlsb.tax)
    END AS tax,
    -- 生成gross字段的来源说明
    CASE
        WHEN st.non_lsb IS NULL THEN CONCAT('(lsb ', st.lsb, ')')
        ELSE CONCAT('(lsb ', st.lsb, ',non-lsb ', st.non_lsb, ')')
    END AS gross_source,
    -- 生成tax字段的来源说明
    CASE
        WHEN st.non_lsb IS NULL THEN CONCAT('(lsb ', st.lsb, ')')
        ELSE CONCAT('(lsb ', st.lsb, ',non-lsb ', st.non_lsb, ')')
    END AS tax_source
FROM Section_table st
-- 关联lsb对应的Quote_ws数据
LEFT JOIN Quote_ws q_lsb ON st.lsb = q_lsb.quote_ws_id
-- 关联non_lsb对应的Quote_ws数据(用LEFT JOIN避免non_lsb为空时丢失行)
LEFT JOIN Quote_ws q_nonlsb ON st.non_lsb = q_nonlsb.quote_ws_id
ORDER BY st.section_id;

语句关键部分解释

  • 两次LEFT JOIN:因为Section_table里的non_lsb可能为null(比如section_id=1的情况),用LEFT JOIN可以保证所有section行都被保留,不会因为non_lsb为空而过滤掉数据。
  • CASE条件判断:针对non_lsb是否为空的两种情况,分别处理拼接逻辑——为空时只显示lsb对应的值,不为空时把lsb和non_lsb的值用+连接。
  • CONCAT函数:用来拼接字符串,把数值、符号和来源说明组合成你需要的格式。

查询结果说明

执行这个语句后,你会得到包含section_id、quote_id、gross、tax、gross_source、tax_source的结果集,其中gross_source和tax_source就是你期望的来源标注。如果需要把来源和对应字段放在同一行展示(比如换行),可以在应用层处理,或者用CONCAT(gross, '\n', gross_source)这样的方式(注意不同客户端对换行符的支持可能不同)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:38