Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接两个表并转换列中的行_Sql_Sql Server - Fatal编程技术网

Sql 连接两个表并转换列中的行

Sql 连接两个表并转换列中的行,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

我有两张桌子:

表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-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。。。。