【问题标题】:How to use subquery in select clause that joins to from clause subquery如何在连接到 from 子句子查询的 select 子句中使用子查询
【发布时间】:2019-10-23 14:23:17
【问题描述】:

我正在尝试将子查询加入到 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
           ...               ...            ...

【问题讨论】:

  • 样本数据、预期结果和逻辑解释都会有所帮助。
  • 使用条件聚合而不是子查询...sum(Case when transactionTypeID = 1 then amount else 0 end) as InterestSum
  • 您的第一个在 SSMS 窗口上验证 OK - 只有在您运行它时才会失败?

标签: sql sql-server subquery


【解决方案1】:

考虑使用条件聚合并完全避免派生表。

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

【讨论】:

  • 太好了,这正是我所需要的。感谢您的帮助,我没有想过使用条件聚合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2014-06-21
  • 2012-01-15
  • 2014-02-23
  • 2021-08-18
相关资源
最近更新 更多