如何在特定条件下合并行?

时间:2019-07-29 08:47:24

标签: sql sql-server tsql

我有一张这样的付款表

Contract_Code  Payment_Year   Payment
470             2010           100
470             2015           50
470             2017           100
471             2011           60
471             2017           100
471             2018           100

我需要查看它,但是例如如果年份在2015年之后,则将付款的行合并为一个,就像这样

Contract_Code  Payment_Year   Payment
470             2010           100
470             2015-2019      150
471             2011           60
471             2015-2019      200

有可能这样做吗?如何?

3 个答案:

答案 0 :(得分:0)

请尝试以下代码-

SELECT Contract_Code,
CASE 
    WHEN YEAR(Payment_Year) >= 2015 THEN '2015-2019' 
    ELSE CAST(YEAR(Payment_Year) AS VARCHAR) 
END Payment_Year,
SUM(Payment)
FROM payments
GROUP BY Contract_Code,
CASE 
    WHEN YEAR(Payment_Year) >= 2015 THEN '2015-2019' 
    ELSE CAST(YEAR(Payment_Year) AS VARCHAR) 
END

您可以检查DEMO HERE

答案 1 :(得分:0)

---CREATE TABLE---
create table #payments(Contract_Code int,Payment_Year int,Payment int)
-----INSERT VALUES---
insert into #payments 
values('470','2010','100'),('470','2015','50'),('470','2017','100'),   ('471','2011','60'),('471','2017','100'),('471','2018','100')
 ----SELECT---
 select contract_code,convert(varchar,payment_year)payment_year,payment from #payments 
 where payment_year<2015
 union
 select contract_code
 ,case when max(payment_year)>=2015 then convert(varchar,min(payment_year))+'- 
'+convert(varchar,MAX(payment_year)) end payment_year
 ,sum(payment) from #payments where payment_year>=2015
 group by contract_code

答案 2 :(得分:0)

case计算中需要一个year表达式。您可以使用APPLY

SELECT p.Contract_Code, v.payment_year, SUM(p.Payment)
FROM payments p
     (VALUES (CASE WHEN p.Payment_Year >= 2015 THEN '2015-2019' ELSE CONVERT(VARCHAR(9), p.Payment_Year) END)
     ) v(payment_year)
GROUP BY Contract_Code, v.payment_year;