Как использовать подзапрос в предложении select, который присоединяется к подзапросу предложения from - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь присоединить подзапрос к подзапросу предложения from. Однако при этом возникает следующая ошибка:

Ошибка SQL [208] [S0002]: недопустимое имя объекта «транзакции»

Я пытаюсь переписать несколько запросов впоместите их в 1 запрос, потому что запрос почти идентичен, отличается только предложение where.

Вот одна из моих попыток:

SELECT
    transactions.OpeningDateFormatted,
    (SELECT SUM(transactions.amount) 
     FROM transactions 
     WHERE transactions.transactiontypeid = 5) AS AdjustmentSum,
    (SELECT SUM(transactions.amount) 
     FROM transactions 
     WHERE transactions.transactiontypeid = 1) AS InterestSum
FROM  
    (SELECT
         FORMAT(files.OpeningDate, 'yyyy-MM') as OpeningDateFormatted,
         amount,
         transactiontypeid
     FROM
         FilesTransactions
     INNER JOIN
         files ON files.id = filestransactions.exid
     WHERE
         FilesTransactions.TransactionDate BETWEEN '2015-10-15' AND '2019-10-15' 
         AND ExID IN (SELECT id FROM files 
                      WHERE files.OpeningDate BETWEEN '2015-10-01' AND '2019-09-30' 
                        AND files.CustomerID = 3258)) transactions
GROUP BY
    transactions.OpeningDateFormatted

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

select
FORMAT(files.OpeningDate, 'yyyy-MM') as OpeningDateFormatted,
(select sum(FilesTransactions.Amount) as CollectedSum from FilesTransactions f2 join FilesTransactions on FilesTransactions.id=f2.id where f2.transactiontypeid = 5 and FORMAT(f2.TransactionDate, 'yyyy-MM') like FORMAT(FilesTransactions.TransactionDate, 'yyyy-MM') )
FROM
    FilesTransactions
    inner join files on files.id = filestransactions.exid
where
FilesTransactions.TransactionDate between '2015-10-15' and '2019-10-15' and
ExID in 
    (
        select id from files where files.OpeningDate between '2015-10-15' and '2019-10-15' and files.CustomerID = 3258
    )
GROUP BY
FORMAT(FilesTransactions.TransactionDate, 'yyyy-MM'), FORMAT(files.OpeningDate, 'yyyy-MM')

Я хотел бы получить один запрос, который дает мне следующий

OpeningDateFormatted | AdjustmentSum | InterestSum
        2015-11             0               45
        2015-12             45.25           7
           ...               ...            ...

1 Ответ

1 голос
/ 23 октября 2019

Рассмотрите возможность использования условного агрегирования и полностью избегайте производной таблицы.

SELECT FORMAT(files.OpeningDate, 'yyyy-MM') as OpeningDateFormatted
     , SUM(CASE when transactiontypeid = 5 then amount else 0 end) AS AdjustmentSum
     , SUM(CASE when transactionTypeID = 1 then amount else 0 end) AS InterestSum
FROM FilesTransactions
INNER JOIN files 
   ON files.id = filestransactions.exid
WHERE FilesTransactions.TransactionDate BETWEEN '2015-10-15' AND '2019-10-15' 
  AND ExID IN (SELECT id 
               FROM files 
               WHERE files.OpeningDate BETWEEN '2015-10-01' AND '2019-09-30' 
                 AND files.CustomerID = 3258)) transactions
GROUP BY FORMAT(files.OpeningDate, 'yyyy-MM')

I might be more inclined to use an exists instead of an IN for exID...

или если вы действительно застряли на использовании таблицы транзакций ... используйте выражение общей таблицы (CTE) ...

WITH Transactions as (SELECT
         FORMAT(files.OpeningDate, 'yyyy-MM') as OpeningDateFormatted,
         amount,
         transactiontypeid
     FROM
         FilesTransactions
     INNER JOIN
         files ON files.id = filestransactions.exid
     WHERE
         FilesTransactions.TransactionDate BETWEEN '2015-10-15' AND '2019-10-15' 
         AND ExID IN (SELECT id FROM files 
                      WHERE files.OpeningDate BETWEEN '2015-10-01' AND '2019-09-30' 
                        AND files.CustomerID = 3258)
SELECT transactions.OpeningDateFormatted,
    (SELECT SUM(transactions.amount) 
     FROM transactions 
     WHERE transactions.transactiontypeid = 5) AS AdjustmentSum,
    (SELECT SUM(transactions.amount) 
     FROM transactions 
     WHERE transactions.transactiontypeid = 1) AS InterestSum
FROM transactions
GROUP BY transactions.OpeningDateFormatted
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...