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

如何编写SQL查询实现两张表内连接并按指定kt_id行转列汇总值

这是个结合连接查询和条件聚合的典型SQL需求,我来给你写对应的查询语句,顺便拆解下思路:

完整SQL语句

SELECT 
    t1.date,
    t1.id,
    t1.t_code,
    t1.typ_1,
    t1.typ_2,
    t2.typ_3
FROM (
    -- 先对Table1按分组维度聚合,计算typ_1和typ_2
    SELECT 
        date1 AS date,
        id,
        t_code,
        SUM(CASE WHEN kt_id = '11201' THEN value ELSE 0 END) AS typ_1,
        SUM(CASE WHEN kt_id = '11208' THEN value ELSE 0 END) AS typ_2
    FROM Table1
    GROUP BY date1, id, t_code
) t1
INNER JOIN (
    -- 对Table2按相同分组维度聚合,计算typ_3
    SELECT 
        date2 AS date,
        id,
        t_code,
        SUM(CASE WHEN kt_id = '23201' THEN value ELSE 0 END) AS typ_3
    FROM Table2
    GROUP BY date2, id, t_code
) t2 
ON t1.date = t2.date 
AND t1.id = t2.id 
AND t1.t_code = t2.t_code;

思路解释

  1. 先聚合再连接:我没有直接把两张表连接后再计算,而是先分别对两张表按date、id、t_code分组聚合,这样能避免直接连接产生笛卡尔积导致的求和结果错误(比如同一分组下两张表都有多条记录时,直接连接会让记录两两配对,重复计算value)。
  2. 条件聚合实现行转列:用SUM(CASE WHEN ...)的方式实现行转列逻辑:
    • 对Table1,只统计kt_id='11201'的value总和作为typ_1,kt_id='11208'的总和作为typ_2,不符合条件的行返回0,不影响求和。
    • 对Table2,同理统计kt_id='23201'的value总和作为typ_3。
  3. 内连接匹配结果:把两个聚合后的结果集用INNER JOIN连接,确保只有date、id、t_code完全匹配的分组才会出现在最终结果里,符合你的需求。

补充说明

关于你给出的最终结果里2021-04-08 | 13 | SH11这条记录:你的Table2示例数据里没有对应分组的记录,若数据无误,这条分组不会出现在内连接的结果中。如果需要保留这类分组并让typ_3显示为0,可以把INNER JOIN改成LEFT JOIN,同时把t2.typ_3替换为COALESCE(t2.typ_3, 0)。

内容的提问来源于stack exchange,提问作者Maco-ic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:33:13