Sql 连接两个表并转换列中的行
我有两张桌子: 表1Sql 连接两个表并转换列中的行,sql,sql-server,Sql,Sql Server,我有两张桌子: 表1 date1 | id | t_code | ac_code | value | kt_id | -------------+-----+--------+---------+--------+--------+ 2021-05-07 | 13 | AF12 | #BT8 | 1 | 11201 | 2021-05-07 | 13 | AF12 | #BT8 | 1 | 11201 | 2021-0
date1 | id | t_code | ac_code | value | kt_id |
-------------+-----+--------+---------+--------+--------+
2021-05-07 | 13 | AF12 | #BT8 | 1 | 11201 |
2021-05-07 | 13 | AF12 | #BT8 | 1 | 11201 |
2021-05-07 | 13 | AF12 | #BT8 | 2 | 11208 |
2021-04-08 | 13 | SH11 | #GS5 | 3 | 11201 |
2021-03-15 | 15 | TG53 | #BA7 | 1 | 11207 |
2021-03-11 | 17 | AF12 | #BT8 | 2 | 11208 |
2021-03-11 | 14 | AF15 | #BT5 | 2 | 11209 |
表2
date2 | id | t_code | value | kt_id |
-------------+-----+--------+--------+--------+
2021-05-07 | 13 | AF12 | 5 | 23201 |
2021-05-07 | 24 | TB39 | 1 | 23203 |
2021-05-07 | 13 | AF12 | 2 | 23208 |
2021-04-08 | 13 | AF12 | 3 | 23201 |
2021-03-11 | 15 | TG53 | 1 | 23207 |
2021-03-11 | 28 | AK21 | 2 | 23208 |
我想用内部联接将这两个表联接起来。on条件应包含日期date1、date2。此外,我将转换线的列。这意味着,我只想在kt_id上选择id的11201作为typ_1,11208作为typ_2,并将它们的值相加。
在表2中,我只想在kt_id上选择id 23201作为typ_3。id、t_代码和日期应相同
所以我想得到以下结果:
date | id | t_code | typ_1 | typ_2 | typ_3 |
-------------+-----+--------+--------+-------+-------+
2021-05-07 | 13 | AF12 | 2 | 2 | 5 |
2021-04-08 | 13 | TB39 | 3 | 0 | 3 |
我如何用sql查询解决这个问题?这应该会提供您所需要的,并给出解释。使用SUM CASE 编辑:查询现在会在连接之前将CTE中两个表中的数据展平,这样它就不会在一个人对多人的情况下散开并膨胀值
;with t1
as (select date1, id, t_code, kt_id, sum([value]) as [value]
from table1
group by date1, id, t_code, kt_id)
, t2
as (select date1, id, t_code, kt_id, sum([value]) as [value]
from table1
group by date1, id, t_code, kt_id)
select t1.date1, t1.id, t1.t_code,
sum(case when t1.kt_id='11201' then t1.[value] else 0 end) as typ_1,
sum(case when t1.kt_id='11208' then t1.[value] else 0 end) as typ_2,
sum(case when t2.kt_id='23201' then t2.[value] else 0 end) as typ_3
from t1
join t2
on t1.id = t2.id
and t1.t_code = t2.t_code
group by t1.date1, t1.id, t1.t_code
order by t1.date1, t1.id, t1.t_code
非常感谢。但是,如果我插入where子句来限制结果,例如:where t1.id=13和t1.t_code='AF12',我得到的typ_1、typ_2和typ_3的值太高,我已经编辑了上面的查询,以便在两个表之间存在多个匹配的情况下进行管理。我们不能只用一个查询来解决它,是吗?这是一个查询。这是一个常见的表表达式CTE。在这里了解更多关于它们的信息谢谢,这个查询很适合。我只有一个额外的要求。我必须过滤表2中的rt_值=0。仅适用于表二。rt_值列只有两个值:1和0。我只想选择0。我已经实现了它,但是我没有得到任何值对于类型为3…..的列,t2作为选择日期1,id,t_代码,kt_id,rt_值,和[value]作为表1中的[value]组,按日期1,id,t_代码,kt_id,rt_值。。。。。和t2.rt_值=0。。。。