Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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_Join - Fatal编程技术网

SQL:将多个行和列合并到一行时出现问题

SQL:将多个行和列合并到一行时出现问题,sql,sql-server,join,Sql,Sql Server,Join,第一次海报,长期潜伏者,这里 我在使用SQL Server进行查询时遇到一些问题。我从几个表中收集事务数据,将它们连接在一起,当它们在某些字段中有值并且共享相同的id paymentid时,我应该将行合并为单个行,如下所示 此查询正在从多个表中收集数据: select dt.transid, dt.accountingdate, dp.paymentdate, dp.paidamount, (case when dt.amounttypeid = 1 then dt.transa

第一次海报,长期潜伏者,这里

我在使用SQL Server进行查询时遇到一些问题。我从几个表中收集事务数据,将它们连接在一起,当它们在某些字段中有值并且共享相同的id paymentid时,我应该将行合并为单个行,如下所示

此查询正在从多个表中收集数据:

select 
   dt.transid, dt.accountingdate, dp.paymentdate, dp.paidamount, 
   (case when dt.amounttypeid = 1 then dt.transamount else 0 end) 'capital',
   (case when dt.amounttypeid = 2 then dt.transamount else 0 end) 'interest',
   dp.paymentid
from 
   dat_trans dt            
join 
   cfg_amounttype_desc cad on dt.amounttypeid = cad.amounttypeid
join 
   cfg_transtype_desc ctd on dt.transtypeid = ctd.transtypeid                
join 
   dat_payment dp on dp.paymentid = dt.paymentid               
where 
   dt.transamount > 0 and dt.paymentid in (4,6,7)
   and dt.transtypeid in (4,16, 42, 90, 121, 128, 129)
和结果在此处为可见性而分隔的行组中:

transid     accountingdate  paymentdate     paidamount  capital   interest    paymentid
1           2014-02-01      2014-01-01      2000        1600      0           1
2           2014-02-01      2014-01-01      2000        0         200         1        
3           2014-02-01      2014-01-01      2000        200       0           1

4           2014-03-02      2014-02-01      1800        1600      0           2
5           2014-03-02      2014-02-01      1800        0         0           2        
6           2014-03-02      2014-02-01      1800        200       0           2

7           2014-04-03      2014-03-01      600         0         100         3
8           2014-04-03      2014-03-01      600         0         0           3        
9           2014-04-03      2014-03-01      600         500       0           3
我的目标是将数据按列、资本和利息进行组合,如下所示:

accountingdate  paymentdate     paidamount  capital   interest    paymentid
2014-02-01      2014-01-01      2000        1800      200         1
2014-03-02      2014-02-01      1800        1700                  2
2014-04-03      2014-03-01      600         500       100         3
-此处未提及transid,其仅用于测试,并将在最终结果中排除

我试图通过使用本网站union、pivot/unpivot、cte上的示例总结资本和利息,但我的结果如下所示:

accountingdate  paymentdate     paidamount  capital   interest    paymentid
2014-02-01      2014-01-01      2000        1800                  1
2014-02-01      2014-01-01      2000                  200         1
也就是说,资本确实加起来了,但仍然有两行而不是一行

因此,基本上,我试图为每笔付款创建一行,并将几列和其他列中的金额相加,这些列将在以后添加,如每笔付款的费用信息。我很感激任何能帮助我解决这个问题的建议。我希望我已经包括了所有需要的信息

提前感谢。

试试这个:

select paymentid, accountingdate, paymentdate,
       sum(paidamount) paidamount,
       sum(capital) capital,
       sum(interest) interest
from (
      select 
         dt.transid, dt.accountingdate, dp.paymentdate, dp.paidamount, 
         (case when dt.amounttypeid = 1 then dt.transamount else 0 end) 'capital',
         (case when dt.amounttypeid = 2 then dt.transamount else 0 end) 'interest',
         dp.paymentid
      from 
         dat_trans dt            
      join 
         cfg_amounttype_desc cad on dt.amounttypeid = cad.amounttypeid
      join 
         cfg_transtype_desc ctd on dt.transtypeid = ctd.transtypeid                
      join 
         dat_payment dp on dp.paymentid = dt.paymentid               
      where 
         dt.transamount > 0 and dt.paymentid in (4,6,7)
         and dt.transtypeid in (4,16, 42, 90, 121, 128, 129)
      )
group by paymentid, accountingdate, paymentdate


如果没有分组查询,很难看到,但看起来您是按transid分组的,但没有选择它?我不确定是否理解您的评论。在这个查询中还没有指定分组,上面是我现在使用的,结果是整个问题的结果,transid是在选择之后先选择的。现在我很困惑选择accountingdate,paymentdate,payment_id,sumifnullpaidamount,0作为paidamount,sum等等,从某个表组中选择accountingdate,paymentdate,付款不起作用?你期望的结果毫无意义。支付ID 2的1700 cpatial从何而来?对于给定paymentid的每一行,paidamount总是相同的吗?如果我有点不清楚,我道歉。资本和利息包括在一组成本中,这些成本将/可以在以后包括,如费用和管理成本。因此,基本上paidamount=资本+利息+费用+管理成本。对于给定的paymentid,paidamount总是相同的。
select 
   dt.accountingdate, dp.paymentdate, 
   sum(dp.paidamount) paidamount, 
   sum((case when dt.amounttypeid = 1 then dt.transamount else 0 end)) capital,
   sum((case when dt.amounttypeid = 2 then dt.transamount else 0 end)) interest,
   dp.paymentid
from 
   dat_trans dt            
join 
   cfg_amounttype_desc cad on dt.amounttypeid = cad.amounttypeid
join 
   cfg_transtype_desc ctd on dt.transtypeid = ctd.transtypeid                
join 
   dat_payment dp on dp.paymentid = dt.paymentid               
where 
   dt.transamount > 0 and dt.paymentid in (4,6,7)
   and dt.transtypeid in (4,16, 42, 90, 121, 128, 129)
group by dt.accountingdate, dp.paymentdate, dp.paymentid