如何从具有不同 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()