如何将多个命名列组合为一行及其总和

How to combine multiple named Columns as a Row and sum of it

我需要在 SQL 中进行查询以将多个行合并到同一个 table。

L_Life_Amount  M_LifeAmount    L_Health_Amount    M_Health_amount
100                 200             300                 400
200                 300             400                 600
300                 400             500                 700

我需要带上下面的结果集

InsuranceType  L_Amount     M_Amount    L_amount-M_amount   
Life amount    600          900         -300
Health amount   1200        1700        -500

Total           1800        2600        -800

这里我需要sumL_life_Amount(L_Amount)sumM_Life_amount(M_Amount)的值,并显示为生命值

我需要对 L_Helath_Amount(L_Amount)M_Health_Amount(M_Amount)sum 执行 sum 的方式相同,并将其显示为生命值

最后我做了 L_amount and M-amount 之间的差异并求和。

使用 Cross Applytable valued constructor 逆透视 数据然后进行数学运算

像这样

;with cte as
(
SELECT insurancetype, 
       l_amount=Sum(l_amount), 
       m_amount=Sum(m_amount), 
       [l_amount-m_amount]=Sum([l_amount-m_amount]) 
FROM   yourtable 
       CROSS apply (VALUES (l_life_amount,m_lifeamount,
                            l_life_amount - m_lifeamount,'Life amount'),
                           (l_health_amount,m_health_amount,
                            l_health_amount - m_health_amount,'Health amount')) cs(l_amount, m_amount, [L_amount-M_amount],insurancetype) 
GROUP  BY insurancetype 
)
select insurancetype,
       l_amount,
       m_amount,
       [l_amount-m_amount]
From CTE
UNION ALL
Select 'Total',
       sum(l_amount),
       sum(m_amount),
       sum([l_amount-m_amount])
From CTE

SQLFIDDLE DEMO

CREATE VIEW Life AS
SELECT 'Life amount' AS InsuranceType,
       sum(L_Life_Amount) AS L_Amount,
       sum(M_Life_Amount) AS M_Amount,
       sum(L_Life_Amount) - sum(M_Life_Amount) AS L_amount-M_Amount
FROM <tablename>

CREATE VIEW Health AS
SELECT 'Health amount' AS InsuranceType,
       sum(L_Health_Amount) AS L_Amount,
       sum(M_Health_Amount) AS M_Amount,
       sum(L_Health_Amount) - sum(M_Health_Amount) AS L_amount-M_Amount
FROM <tablename>

CREATE VIEW Total AS
SELECT 'Total' AS InsuranceType,
       sum(L_Amount),
       sum(M_Amount),
       sum(L_Amount-M_Amount),
FROM Life UNION Health

SELECT * FROM Life UNION Health UNION Total

(不确定语法是否正确...)

我们可以借助 CTECTE

中的联合得到这个解决方案
declare @temp table

(
L_Life_Amount int,
M_LifeAmount    int,
L_Health_Amount int,
M_Health_amount int
);


insert into @temp values (100, 200, 300, 400)
insert into @temp values (200, 300, 400, 600)
insert into @temp values (300, 400, 500, 700)


;with cte as(
select 'Life amount' as InsuranceType , sum(L_Life_Amount) L_Amount ,SUM(M_LifeAmount) M_Amount,sum(L_Life_Amount)- SUM(M_LifeAmount) as [L_amount-M_amount]  from @temp
union
select 'Health amount' as InsuranceType , sum(L_Health_Amount) L_Amount ,SUM(M_Health_amount) M_Amount, sum(L_Health_Amount)-SUM(M_Health_amount)  from @temp) 

select * from cte
union
select 'Total' , sum(L_Amount), sum(M_Amount),sum([L_amount-M_amount]) from cte