Есть ли способ получить общую сумму в каждом операторе select case? Следующее дает мне правильную сумму, указав общую сумму за каждый месяц в столбце, но я хотел бы иметь единую сумму для каждого оператора case.

SELECT SUM(
           CASE WHEN dbo.bill_t_ARTransaction.TransactionDate BETWEEN '2000-01-01' AND '2016-12-31' THEN dbo.bill_t_ARTransaction.Amount ELSE 0 END
           ) AS 'Dec16'
        , SUM(
              CASE WHEN dbo.bill_t_ARTransaction.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31' THEN dbo.bill_t_ARTransaction.Amount ELSE 0 END
              ) AS 'JAN17'
FROM dbo.bill_t_ARTransaction
INNER JOIN dbo.bill_t_TripTicket ON (
                                     dbo.bill_t_ARTransaction.RunNumber = dbo.bill_t_TripTicket.RunNumber
                                     )
INNER JOIN dbo.med_m_Company     ON (
                                     dbo.bill_t_TripTicket.CompanyCode = dbo.med_m_Company.CompanyCode
                                     )
WHERE dbo.bill_t_TripTicket.CompanyCode = '105'
  AND dbo.bill_t_ARTransaction.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31'
GROUP BY dbo.bill_t_ARTransaction.TransactionDate
0
TomRanch 26 Июн 2017 в 16:34
Итак, вы хотите сгруппировать до 16 декабря и 17 января?
 – 
Scrobi
26 Июн 2017 в 16:40
(1) Отметьте свой вопрос с помощью базы данных, которую вы используете. (2) Покажите формат, в котором вы хотите получить результаты.
 – 
Gordon Linoff
26 Июн 2017 в 16:43
Правильно - я хотел бы получить единую сумму за 16 декабря, а затем за 17 января. Каждый месяц по мере продвижения финансового года я хотел бы, чтобы в следующий столбец включались все предыдущие данные и добавлялся текущий месяц к итоговой сумме.
 – 
TomRanch
26 Июн 2017 в 16:43
Спасибо, Гордон, я не видел, что у меня есть варианты в моем теге.
 – 
TomRanch
26 Июн 2017 в 16:45
Итак, вам нужен месяц и промежуточный итог за 16 декабря и 17 января?
 – 
Scrobi
26 Июн 2017 в 16:50

3 ответа

Я только что отформатировал ваш SQL - чтобы он был более читабельным для людей - и поместил его в Subselect.
Во внешнем Select я просто добавил СУММ двух вычисляемых столбцов.

SELECT sums.*
      ,SUM(sums.DEC16 + sums.JAN17) AS TOTAL_SUM
  FROM (     
            SELECT SUM( CASE WHEN dbo.bill_t_ARTransaction.TransactionDate 
                                  BETWEEN '2000-01-01' 
                                      AND '2016-12-31' 
                             THEN dbo.bill_t_ARTransaction.Amount 
                             ELSE 0 
                        END
                       ) AS DEC16
                   ,SUM( CASE WHEN dbo.bill_t_ARTransaction.TransactionDate 
                                   BETWEEN '2000-01-01' 
                                       AND '2017-01-31' 
                              THEN dbo.bill_t_ARTransaction.Amount 
                              ELSE 0 
                         END
                       ) AS JAN17
             FROM dbo.bill_t_ARTransaction
            INNER JOIN dbo.bill_t_TripTicket 
               ON dbo.bill_t_ARTransaction.RunNumber = dbo.bill_t_TripTicket.RunNumber
            INNER JOIN dbo.med_m_Company     
               ON dbo.bill_t_TripTicket.CompanyCode  = dbo.med_m_Company.CompanyCode
            WHERE dbo.bill_t_TripTicket.CompanyCode        = '105'
              AND dbo.bill_t_ARTransaction.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31'
            GROUP BY dbo.bill_t_ARTransaction.TransactionDate
        ) sums
0
Esteban P. 26 Июн 2017 в 16:44
Я прошу прощения. Думаю, я не был достаточно ясным. Эстебан, ваш запрос подсчитывает каждый месяц (после того, как я добавил предложение group by для совокупности сумм). Каждая строка - декабрь + январь для каждого месяца в диапазоне дат. Хотелось бы иметь единую сумму. 16 декабря будет суммой с 1 января 2000 г. по 31 декабря 2016 г., а 17 января - суммой с 1 января 2000 г. по 31 января 2017 г.
 – 
TomRanch
26 Июн 2017 в 16:57

Думаю, вы просто хотите получить право на GROUP BY:

SELECT SUM(CASE WHEN ba.TransactionDate BETWEEN '2000-01-01' AND '2016-12-31'
               THEN ba.Amount ELSE 0
           END) AS Dec16,
       SUM(CASE WHEN ba.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31'
                THEN ba.Amount ELSE 0
            END) AS JAN17
FROM dbo.bill_t_ARTransaction ba INNER JOIN
     dbo.bill_t_TripTicket bt
     ON ba.RunNumber = bt.RunNumber INNER JOIN
     dbo.med_m_Company c
     ON bt.CompanyCode = c.CompanyCode
WHERE bt.CompanyCode = '105' AND
      ba.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31';

Обратите внимание на другие изменения, которые я внес в запрос:

  • Я удалил одинарные кавычки из псевдонимов столбцов. Одиночные кавычки следует использовать только для значений строки и даты (использование их для псевдонимов столбцов разрешено, но может вызвать путаницу).
  • Таблицам даны псевдонимы.
  • Имена столбцов дополняются псевдонимами (запрос легче писать и читать.
  • Обратите внимание, что '105' не должно иметь кавычек, если CompanyCode является числовым.

Я думаю, что запрос можно упростить до:

SELECT SUM(CASE WHEN ba.TransactionDate BETWEEN '2000-01-01' AND '2016-12-31'
               THEN ba.Amount ELSE 0
           END) AS Dec16,
       SUM(CASE WHEN ba.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31'
                THEN ba.Amount ELSE 0
            END) AS JAN17
FROM dbo.bill_t_ARTransaction ba INNER JOIN
     dbo.bill_t_TripTicket bt
     ON ba.RunNumber = bt.RunNumber 
WHERE bt.CompanyCode = 105 AND
      ba.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31';

Таблица Company не используется.

0
Gordon Linoff 26 Июн 2017 в 16:45
РЕШЕНО - Спасибо, Гордон - Верх - это именно то, что я пытался сделать. Также большое спасибо вам за все, что помогло. Эта группа фантастическая!
 – 
TomRanch
26 Июн 2017 в 17:05

Ты можешь это сделать:

SELECT  DATENAME(MONTH, Transaction.TransactionDate) + RIGHT(YEAR(Transaction.TransactionDate), 2) AS MonthYear
,       SUM(Transaction.Amount) AS Amount
FROM    dbo.bill_t_ARTransaction Transaction
INNER JOIN dbo.bill_t_TripTicket Ticket
    ON Transaction.RunNumber = Ticket.RunNumber 
INNER JOIN dbo.med_m_Company Company
    ON Ticket.CompanyCode = Company.CompanyCode 
WHERE   Ticket.CompanyCode = '105'
        AND Transaction.TransactionDate >= '2000-01-01' 
        AND Transaction.TransactionDate < '2017-02-01'
GROUP BY DATENAME(MONTH, Transaction.TransactionDate) + RIGHT(YEAR(Transaction.TransactionDate), 2)

Предполагая, что dbo.bill_t_ARTransaction.TransactionDate - это datetime(2): знаете ли вы, что в 'DEC16' вам не хватает транзакции (например) из 2016-12-31 11:00:00? BETWEEN включается с обеих сторон, а даты по умолчанию равны полуночи (00:00:00), если компонент времени не определен. Я соответствующим образом изменил пункт WHERE. Я также добавил псевдонимы, чтобы облегчить чтение.

0
HoneyBadger 26 Июн 2017 в 16:56