如果在表中创建了新条目,则使用减法计算SQL总和
如果表格中有新条目,我会尝试用减法求总和 TotalPoints查询:如果在表中创建了新条目,则使用减法计算SQL总和,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,如果表格中有新条目,我会尝试用减法求总和 TotalPoints查询: SELECT SUM(t.TotalUserActions) as Actions, sum(t.AllTotalPoints) as TotalPoints, (select Name from CustomerTable where CustomerId=1) as Name from ( SELECT CASE WHEN LoayaltyPointsTable.LoyaltyPointsId=4 THE
SELECT SUM(t.TotalUserActions) as Actions, sum(t.AllTotalPoints) as TotalPoints,
(select Name from CustomerTable where CustomerId=1) as Name from
(
SELECT CASE
WHEN LoayaltyPointsTable.LoyaltyPointsId=4 THEN (SELECT COUNT(amount)
FROM RedeemPointsTable where CustomerId=1)
ELSE COUNT(CustomerTable.CustomerId)
END as TotalUserActions , CustomerTable.Name,
CASE
WHEN LoayaltyPointsTable.LoyaltyPointsId=4 THEN (SELECT SUM(amount)
FROM RedeemPointsTable where CustomerId=1)*Points
ELSE SUM(LoayaltyPointsTable.Points)
END as AllTotalPoints
FROM
LoayaltyPointsTable
INNER JOIN
LoyaltyDetailsTable
on LoayaltyPointsTable.LoyaltyPointsId = LoyaltyDetailsTable.LoyaltyPointsId
INNER JOIN
CustomerTable
on CustomerTable.CustomerId = LoyaltyDetailsTable.CustomerId
where CustomerTable.CustomerID =1
group by CustomerTable.Name,LoayaltyPointsTable.LoyaltyPointsId,
LoayaltyPointsTable.Points,CustomerTable.CustomerId
) t
Actions Totalpoints Name
30 500 John
TotalPoints:
100 // (500-400)
Totalpoints查询输出:
SELECT SUM(t.TotalUserActions) as Actions, sum(t.AllTotalPoints) as TotalPoints,
(select Name from CustomerTable where CustomerId=1) as Name from
(
SELECT CASE
WHEN LoayaltyPointsTable.LoyaltyPointsId=4 THEN (SELECT COUNT(amount)
FROM RedeemPointsTable where CustomerId=1)
ELSE COUNT(CustomerTable.CustomerId)
END as TotalUserActions , CustomerTable.Name,
CASE
WHEN LoayaltyPointsTable.LoyaltyPointsId=4 THEN (SELECT SUM(amount)
FROM RedeemPointsTable where CustomerId=1)*Points
ELSE SUM(LoayaltyPointsTable.Points)
END as AllTotalPoints
FROM
LoayaltyPointsTable
INNER JOIN
LoyaltyDetailsTable
on LoayaltyPointsTable.LoyaltyPointsId = LoyaltyDetailsTable.LoyaltyPointsId
INNER JOIN
CustomerTable
on CustomerTable.CustomerId = LoyaltyDetailsTable.CustomerId
where CustomerTable.CustomerID =1
group by CustomerTable.Name,LoayaltyPointsTable.LoyaltyPointsId,
LoayaltyPointsTable.Points,CustomerTable.CustomerId
) t
Actions Totalpoints Name
30 500 John
TotalPoints:
100 // (500-400)
价格表
Priceid Title Discriptions Pricepoints
1 abc abc 400
2 def def 500
PriceClaimId CustomerId PriceId
1 1 22
2 2 23
价格索赔表
Priceid Title Discriptions Pricepoints
1 abc abc 400
2 def def 500
PriceClaimId CustomerId PriceId
1 1 22
2 2 23
使用上表,我试图减去TotalPoints–基于PriceClaimTable中的CustomerId和PriceId的Pricepoints
如果PriceClaimTable中没有基于Customerid的新条目,那么只显示Totalpoints而不进行减法
到目前为止,我试图找到价格点
select PriceTable.PricePoints from PriceTable
inner join PriceClaimTable
on PriceTable.PriceId = PriceClaimTable.PriceId
inner join CustomerTable
on CustomerTable.CustomerId = PriceClaimTable.CustomerId
where CustomerTable.CustomerId =1
group by PriceTable.PricePoints
这使我的输出为:
PricePoints
400
预期输出:
SELECT SUM(t.TotalUserActions) as Actions, sum(t.AllTotalPoints) as TotalPoints,
(select Name from CustomerTable where CustomerId=1) as Name from
(
SELECT CASE
WHEN LoayaltyPointsTable.LoyaltyPointsId=4 THEN (SELECT COUNT(amount)
FROM RedeemPointsTable where CustomerId=1)
ELSE COUNT(CustomerTable.CustomerId)
END as TotalUserActions , CustomerTable.Name,
CASE
WHEN LoayaltyPointsTable.LoyaltyPointsId=4 THEN (SELECT SUM(amount)
FROM RedeemPointsTable where CustomerId=1)*Points
ELSE SUM(LoayaltyPointsTable.Points)
END as AllTotalPoints
FROM
LoayaltyPointsTable
INNER JOIN
LoyaltyDetailsTable
on LoayaltyPointsTable.LoyaltyPointsId = LoyaltyDetailsTable.LoyaltyPointsId
INNER JOIN
CustomerTable
on CustomerTable.CustomerId = LoyaltyDetailsTable.CustomerId
where CustomerTable.CustomerID =1
group by CustomerTable.Name,LoayaltyPointsTable.LoyaltyPointsId,
LoayaltyPointsTable.Points,CustomerTable.CustomerId
) t
Actions Totalpoints Name
30 500 John
TotalPoints:
100 // (500-400)
如何在一次查询中减去结果并根据customerid计算总分和
其他表格结构:
SELECT SUM(t.TotalUserActions) as Actions, sum(t.AllTotalPoints) as TotalPoints,
(select Name from CustomerTable where CustomerId=1) as Name from
(
SELECT CASE
WHEN LoayaltyPointsTable.LoyaltyPointsId=4 THEN (SELECT COUNT(amount)
FROM RedeemPointsTable where CustomerId=1)
ELSE COUNT(CustomerTable.CustomerId)
END as TotalUserActions , CustomerTable.Name,
CASE
WHEN LoayaltyPointsTable.LoyaltyPointsId=4 THEN (SELECT SUM(amount)
FROM RedeemPointsTable where CustomerId=1)*Points
ELSE SUM(LoayaltyPointsTable.Points)
END as AllTotalPoints
FROM
LoayaltyPointsTable
INNER JOIN
LoyaltyDetailsTable
on LoayaltyPointsTable.LoyaltyPointsId = LoyaltyDetailsTable.LoyaltyPointsId
INNER JOIN
CustomerTable
on CustomerTable.CustomerId = LoyaltyDetailsTable.CustomerId
where CustomerTable.CustomerID =1
group by CustomerTable.Name,LoayaltyPointsTable.LoyaltyPointsId,
LoayaltyPointsTable.Points,CustomerTable.CustomerId
) t
Actions Totalpoints Name
30 500 John
TotalPoints:
100 // (500-400)
任何帮助都会很好。基于SQL Fiddle,我做了一个新的尝试,我相信这是正确的,尽管John返回81而不是100:
; with LP (CustomerId, Name, UserActions, TotalPoints) as (
SELECT
C.CustomerId,
C.Name,
sum(case when P.LoyaltyPointsId = 4 then isnull(R.RedeemCount, 0) else 1 end),
sum(P.Points * case when P.LoyaltyPointsId = 4 then isnull(R.RedeemAmount,0) else 1 end)
from
CustomerTable C
join LoyaltyDetailsTable D on D.CustomerId = C.CustomerId
join LoyaltyPointTable P on P.LoyaltyPointsId = D.LoyaltyPointsId
outer apply (
select sum(Amount) as RedeemAmount, count(Amount) as RedeemCount
from RedeemPointsTable R
where R.CustomerId = C.CustomerId
) R
group by C.CustomerId, C.Name
),
PP (CustomerId, Pricepoints) as (
select C.CustomerId, sum(P.Pricepoints)
from PriceTable P
join PriceClaimTable C on P.PriceClaimId = C.PriceClaimId
group by C.CustomerId
)
select
LP.CustomerId, LP.Name, LP.UserActions, LP.TotalPoints - isnull(PP.Pricepoints, 0) as Points
from
LP
left outer join PP on LP.CustomerId = PP.CustomerId
order by LP.CustomerId
假设客户总是从忠诚度表中找到,但不必从兑换表或价格表中找到
此版本的SQL FIDLE:是否可以将这两个查询都设置为CTE,然后合并结果?您需要将这些列添加到连接所需的select子句中。@JamesZ,您能举个例子吗?我已经用PriceTable结构和SQLFIDLE中的其他表更新了文章,看一看,可能会对您有所帮助,到时候我将使用CTEhi尝试您的查询谢谢您的努力,我正在尝试使用where customer id=1查找,检查是否有清晰的视图。当然,您可以在那里添加customer id=1的条件,然后它将只返回第一行。顺便问一下,我们是否真的有意让来自RedemptionStable的数据计算两次,因为在LoyaltyDetailsTable中有两条记录。也许你错过了一个日期?嗨,正如你说的检查,我不能在中使用客户id,你能不能编辑我尝试过的那些,但你的SQL太混乱了,我无法理解或修复,这就是为什么我写了我自己的。。。根据表格,我仍然认为这是正确的(除了稳定,这没有意义…)