Как вычесть 2 значения из 2 разных столбцов одной таблицы с разными условиями ГДЕ? - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь вычесть 2 суммированных значения из 2 разных столбцов одной и той же таблицы, а затем вставить одно значение в другую таблицу, НО суммированные значения извлекаются с разными условиями, и я не могу найти решение!

Первый запрос:

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'

Я должен вычесть значения из результатов запросов: сначала - второй, а затем вставьте его в один столбец другой таблицы, и способ вставки значений в другую таблицу выглядит следующим образом:

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'),

Это только часть, но Вы получаете точку, и оба этих суммированных значения также вставляются в столбцы таблицы2, я попытался поместить выборки в выборку, но она не работает и выглядит ужасно!

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Требуется условное агрегирование для разницы:

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, но я подозреваю, что можно использовать тот же метод.

1 голос
/ 07 мая 2019

Попробуй это. Теперь вы можете легко рассчитать разницу между двумя результатами 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()

Чтобы получить разницу между двумя суммами, просто используйте следующий запрос, который вернет одно значение. Вы также можете использовать это для вставки.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...