SQL:将多个行和列合并到一行时出现问题
第一次海报,长期潜伏者,这里 我在使用SQL Server进行查询时遇到一些问题。我从几个表中收集事务数据,将它们连接在一起,当它们在某些字段中有值并且共享相同的id paymentid时,我应该将行合并为单个行,如下所示 此查询正在从多个表中收集数据: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
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