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
相关产品推荐
相关产品推荐

