如何将多个命名列组合为一行及其总和
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
这里我需要sum
L_life_Amount(L_Amount)
和sum
的M_Life_amount(M_Amount)
的值,并显示为生命值
我需要对 L_Helath_Amount(L_Amount)
和 M_Health_Amount(M_Amount)
的 sum
执行 sum
的方式相同,并将其显示为生命值
最后我做了 L_amount and M-amount
之间的差异并求和。
使用 Cross Apply
和 table 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
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
(不确定语法是否正确...)
我们可以借助 CTE
和 CTE
中的联合得到这个解决方案
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
我需要在 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
这里我需要sum
L_life_Amount(L_Amount)
和sum
的M_Life_amount(M_Amount)
的值,并显示为生命值
我需要对 L_Helath_Amount(L_Amount)
和 M_Health_Amount(M_Amount)
的 sum
执行 sum
的方式相同,并将其显示为生命值
最后我做了 L_amount and M-amount
之间的差异并求和。
使用 Cross Apply
和 table 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
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
(不确定语法是否正确...)
我们可以借助 CTE
和 CTE
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