Запрос для получения итогов по всем строкам с одинаковым значением столбца с условиями для каждого столбца - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь получить итоги для каждого местоположения из @SalesTotals, который содержит записи транзакций всех продаж, как показано ниже. Хотя итоги TotalPreTaxSales, TotalNetCheckAmount, TotalTaxAmount рассчитаны правильно, все итоги после этого (содержащие подзапросы) суммируют все значения таблицы, а не только значения для каждого местоположения. Как мне написать это, чтобы получить только итоги по местоположению?

INSERT INTO @CalcTable 
(BusinessDate,
Location, 
TotalPreTaxSales, 
TotalNetCheckAmount, 
TotalTaxAmount, 
TotalCreditCardSales,
TotalMasterCardCardSales,
TotalVisaCardSales,
TotalDiscoverCardSales,
TotalAmexCardSales,
TotalCashSales,
TotalCashReceived
)

SELECT 
@DOB, 
LocationID, 
SUM(CheckPreTaxAmount), 
SUM(NetCheckAmount), 
SUM(CheckTaxAmount), 
(SELECT SUM(NetCheckAmount) FROM @SalesTotals WHERE TenderCredit = 'MasterCard' OR Tender = 'Visa' OR 
Tender = 'Discover' OR Tender = 'AMEX'),
(SELECT SUM(NetCheckAmount) FROM @SalesTotals WHERE TenderCredit = 'MasterCard'), 
(SELECT SUM(NetCheckAmount) FROM @SalesTotals where TenderCredit = 'Visa'),
(SELECT SUM(NetCheckAmount) FROM @SalesTotals where TenderCredit = 'Discover'),
(SELECT SUM(NetCheckAmount) FROM @SalesTotals where TenderCredit = 'AMEX'),
(SELECT SUM(NetCheckAmount) FROM @SalesTotals where TenderCash = 1),
(SELECT SUM(CashReceived) FROM @SalesTotals where TenderCash = 1)
FROM @SalesTotals group by LocationId

SELECT * FROM @CalcTable

1 Ответ

1 голос
/ 16 апреля 2020

Полагаю, в таблице @FinalTotals есть столбец типа LocationId, который ссылается на таблицу @SalesTotals. Если это так, то вы можете агрегировать отдельно по каждой таблице и объединять результаты:

SELECT 
  st.DOB, st.CheckPreTaxAmount, st.NetCheckAmount, st.CheckTaxAmount,  
  ft.sum1, ft.sum2, ft.sum3, ft.sum4, ft.sum5, ft.sum6, ft.sum7
FROM (
  @DOB DOB, 
  LocationID, 
  SUM(CheckPreTaxAmount) CheckPreTaxAmount, 
  SUM(NetCheckAmount) NetCheckAmount, 
  SUM(CheckTaxAmount) CheckTaxAmount, 
  FROM @SalesTotals 
  GROUP BY LocationId
) st LEFT JOIN (
  SELECT LocationId,
    SUM(CASE WHEN TenderCredit = 'MasterCard' OR Tender IN ('Visa', 'Discover', 'AMEX') THEN NetCheckAmount ELSE 0 END) sum1,
    SUM(CASE WHEN TenderCredit = 'MasterCard' THEN NetCheckAmount ELSE 0 END) sum2,
    SUM(CASE WHEN TenderCredit = 'Visa' THEN NetCheckAmount ELSE 0 END) sum3,
    SUM(CASE WHEN TenderCredit = 'Discover' THEN NetCheckAmount ELSE 0 END) sum4,
    SUM(CASE WHEN TenderCredit = 'AMEX' THEN NetCheckAmount ELSE 0 END) sum5,
    SUM(CASE WHEN TenderCash = 1 THEN NetCheckAmount ELSE 0 END) sum6,
    SUM(CASE WHEN TenderCash = 1 THEN CashReceived ELSE 0 END) sum7
  FROM @FinalTotals
  GROUP BY LocationId
) ft
ON ft.LocationId = st.LocationId
...