如何从具有不同 WHERE 条件的相同 table 的 2 个不同列中减去 2 个值?
How to subtract 2 values from 2 different columns of the same table with different WHERE conditions?
我试图从相同 table 的 2 个不同列中减去 2 个求和值,然后将单个值插入另一个 table 但是求和值是在不同的 where 条件下检索的,我似乎找不到解决方案!
第一个问题:
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE ticketDate > dateadd(hh,-1,getdate())
AND ticketDate < GETDATE() AND ticketState IN ('STAND BY' , 'WIN' , 'LOSE')
第二个问题:
select SUM(ticketTotalWin)
FROM tickets
WHERE ticketDate > dateadd(hh,-1,getdate()) AND ticketDate < GETDATE()
AND ticketState = 'WIN'
我必须从查询结果中减去这些值:
第一 - 第二,然后将其插入另一个 table 的单列中,我将值插入另一个 table 的方式是这样的:
insert into ticketsAmounts (totalAmountPlay, totalAmountStandBy, totalAmountLose, totalAmountRefused, totalAmountWin, totalAmountClosed, totalAmountPayout, totalAmountRating, totalTickets)
SELECT
(select SUM(ticketTotalAmount)
from tickets
where ticketDate > dateadd(hh,-1,getdate())
AND ticketDate < GETDATE()
AND ticketState IN ('STAND BY' , 'WIN' , 'LOSE')),
(select SUM(ticketTotalAmount)
from tickets
where ticketDate > dateadd(hh,-1,getdate())
AND ticketDate < GETDATE() AND ticketState = 'STAND BY'),
(select SUM(ticketTotalAmount)
from tickets
where ticketDate > dateadd(hh,-1,getdate())
AND ticketDate < GETDATE() AND ticketState = 'LOSE'),
这只是一部分,但你明白了,而且这两个求和值也被插入到 table2 的列中,我试过将 selects 放入 select 但它不起作用,而且看起来很可怕!
您想要对差异进行条件聚合:
SELECT (SUM(ticketTotalAmount) -
SUM(CASE WHEN ticketState = 'WIN' THEN ticketTotalWin ELSE 0 END)
) as diff
FROM tickets
WHERE ticketDate > dateadd(hour, 1, getdate()) AND
ticketDate < GETDATE() AND
ticketState IN ('STAND BY', 'WIN' , 'LOSE');
我看不出 insert
的其他列是如何计算的,但我怀疑可以使用相同的方法。
试试这个。您现在可以轻松计算两个 SUM 结果之间的差异。
SELECT
SUM(
CASE
WHEN ticketState IN ('STAND BY' , 'WIN' , 'LOSE') THEN ticketTotalAmount
ELSE 0
END
) AS TotalAmount,
SUM(
CASE
WHEN ticketState = 'WIN' THEN ticketTotalWin
ELSE 0
END
) AS TotalWin
FROM tickets
WHERE ticketDate > DATEADD(hh,-1,GETDATE()) AND ticketDate < GETDATE()
要获得两个总和之间的差异,只需使用以下查询,它将 return 一个单一的值。您也可以将其用于插入目的。
SELECT
SUM(
CASE
WHEN ticketState IN ('STAND BY' , 'WIN' , 'LOSE') THEN ticketTotalAmount
ELSE 0
END
) -
SUM(
CASE
WHEN ticketState = 'WIN' THEN ticketTotalWin
ELSE 0
END
) AS TotalDifference
FROM tickets
WHERE ticketDate > DATEADD(hh,-1,GETDATE()) AND ticketDate < GETDATE()
我试图从相同 table 的 2 个不同列中减去 2 个求和值,然后将单个值插入另一个 table 但是求和值是在不同的 where 条件下检索的,我似乎找不到解决方案!
第一个问题:
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE ticketDate > dateadd(hh,-1,getdate())
AND ticketDate < GETDATE() AND ticketState IN ('STAND BY' , 'WIN' , 'LOSE')
第二个问题:
select SUM(ticketTotalWin)
FROM tickets
WHERE ticketDate > dateadd(hh,-1,getdate()) AND ticketDate < GETDATE()
AND ticketState = 'WIN'
我必须从查询结果中减去这些值: 第一 - 第二,然后将其插入另一个 table 的单列中,我将值插入另一个 table 的方式是这样的:
insert into ticketsAmounts (totalAmountPlay, totalAmountStandBy, totalAmountLose, totalAmountRefused, totalAmountWin, totalAmountClosed, totalAmountPayout, totalAmountRating, totalTickets)
SELECT
(select SUM(ticketTotalAmount)
from tickets
where ticketDate > dateadd(hh,-1,getdate())
AND ticketDate < GETDATE()
AND ticketState IN ('STAND BY' , 'WIN' , 'LOSE')),
(select SUM(ticketTotalAmount)
from tickets
where ticketDate > dateadd(hh,-1,getdate())
AND ticketDate < GETDATE() AND ticketState = 'STAND BY'),
(select SUM(ticketTotalAmount)
from tickets
where ticketDate > dateadd(hh,-1,getdate())
AND ticketDate < GETDATE() AND ticketState = 'LOSE'),
这只是一部分,但你明白了,而且这两个求和值也被插入到 table2 的列中,我试过将 selects 放入 select 但它不起作用,而且看起来很可怕!
您想要对差异进行条件聚合:
SELECT (SUM(ticketTotalAmount) -
SUM(CASE WHEN ticketState = 'WIN' THEN ticketTotalWin ELSE 0 END)
) as diff
FROM tickets
WHERE ticketDate > dateadd(hour, 1, getdate()) AND
ticketDate < GETDATE() AND
ticketState IN ('STAND BY', 'WIN' , 'LOSE');
我看不出 insert
的其他列是如何计算的,但我怀疑可以使用相同的方法。
试试这个。您现在可以轻松计算两个 SUM 结果之间的差异。
SELECT
SUM(
CASE
WHEN ticketState IN ('STAND BY' , 'WIN' , 'LOSE') THEN ticketTotalAmount
ELSE 0
END
) AS TotalAmount,
SUM(
CASE
WHEN ticketState = 'WIN' THEN ticketTotalWin
ELSE 0
END
) AS TotalWin
FROM tickets
WHERE ticketDate > DATEADD(hh,-1,GETDATE()) AND ticketDate < GETDATE()
要获得两个总和之间的差异,只需使用以下查询,它将 return 一个单一的值。您也可以将其用于插入目的。
SELECT
SUM(
CASE
WHEN ticketState IN ('STAND BY' , 'WIN' , 'LOSE') THEN ticketTotalAmount
ELSE 0
END
) -
SUM(
CASE
WHEN ticketState = 'WIN' THEN ticketTotalWin
ELSE 0
END
) AS TotalDifference
FROM tickets
WHERE ticketDate > DATEADD(hh,-1,GETDATE()) AND ticketDate < GETDATE()