【问题标题】:SQL Left Outer Join on Subquery子查询上的 SQL 左外连接
【发布时间】:2016-10-18 10:53:40
【问题描述】:

我正在尝试构建一个包含左连接子查询的查询——基于我在previous question 中学到的原则——它应该从两个不同的表中提取相似的数据集。目标是通过account || platform 比较卷数据,以确保从另一个表创建一个表的存储过程正确执行。

想法是这样的:

Account || Product || T1Vol || T2Vol
abc        AT         10        10
def        RT         20        25
ghi        OB         30

因此,在此示例中,我们的想法是从 T1(过程所作用的表)中提取所有帐户和产品,以及从 T2(新创建的表)中提取匹配的所有帐户和产品(因此,Left Join在 T1 = T2)。 (理想情况下,一切都将完美匹配,T1 与 T2 体积没有差异,T2 体积也没有空值)。

我编写了以下查询来完成此操作,但效果不佳。我得到的当前错误是not a GROUP BY expression - 我不认为这是真正的问题。我一直在搜索并且迭代无济于事。

查询如下。 (为了与示例保持一致,T1 = OpStatsT2 = RegSplits。非常感谢任何帮助。

  SELECT DTA.trading_code Account, OpStats.product_dwkey Platform, SUM(OpStats.risk_amount_adj)/1000000 OpStatsVol, RegSplits.Volume RegSplitsVol
  FROM fact_trade_presplit_rollup OpStats
  INNER JOIN dim_trading_accounts DTA ON OpStats.trading_dwkey=DTA.trading_dwkey
  LEFT OUTER JOIN 
                  ( SELECT b.trading_Code Account, a.product_dwkey Platform, SUM(a.risk_amount_adj)/1000000 Volume
                    FROM fact_trade_rollup a 
                    INNER JOIN dim_trading_accounts b on a.trading_dwkey=b.trading_dwkey
                    WHERE a.account_type IN('Customer','Taker') 
                      AND a.date_key>='01-JAN-16' 
                      AND a.date_key<='31-MAR-16'
                      AND a.daily_db_metric NOT IN ('Manual Treasury Volume ($B)', 'Manual Volume ($B)', 'HSBC-WL POMS (Internal) Volume ($B)','JPMC-WL Order Book (Internal) Volume ($B)')
                      AND (a.product_dwkey IN('RT','HWL') AND a.source_name<>'STP')
                    GROUP BY b.trading_code, a.product_dwkey ) RegSplits
                ON (DTA.trading_code = RegSplits.Account) /* is it because I am trying to join DTA to the subquery */
  WHERE OpStats.account_type IN('Customer','Taker') 
    AND OpStats.date_key>='01-JAN-16' 
    AND OpStats.date_key<='31-MAR-16'
    AND OpStats.daily_db_metric NOT IN ('Manual Treasury Volume ($B)', 'Manual Volume ($B)', 'HSBC-WL POMS (Internal) Volume ($B)','JPMC-WL Order Book (Internal) Volume ($B)')
    AND (OpStats.product_dwkey IN('RT','HWL') AND OpStats.source_name<>'STP')
  GROUP BY DTA.trading_code, OpStats.product_dwkey;

【问题讨论】:

  • 也许我做得太简单了,但乍一看,在我看来,第一个 Select 中有一个字段不属于 group by? ", RegSplits.Volume RegSplitsVol"
  • @DavidW 谢谢 - 我什至没有看到,因为我认为它是一个 SUM 聚合,因为它在子查询中!
  • 很高兴为您提供帮助。看起来我应该把它作为答案发布,但其他人做了:) LOL

标签: sql oracle subquery outer-join


【解决方案1】:

“不按表达式分组”错误很容易检查。
只需将 SELECT 表达式与 GROUP BY 表达式进行比较:

 SELECT DTA.trading_code Account, 
       OpStats.product_dwkey Platform, 
       SUM(OpStats.risk_amount_adj)/1000000 OpStatsVol, 
       RegSplits.Volume RegSplitsVol
FROM ......
......
GROUP BY DTA.trading_code, 
        OpStats.product_dwkey;

SELECT 中有两个元素不在 GROUP BY 中:

  1. SUM(OpStats.risk_amount_adj)/1000000 OpStatsVol
  2. RegSplits.Volume RegSplitsVol

数字 1 没问题 - 它是一个聚合函数,它不能在 GROUP BY 中。
数字 2 导致了这个错误 - 它不是一个聚合函数,它没有在 GROUP BY 中列出GROUP BY 子句。

【讨论】:

  • 谢谢 - 我什至没有看到,因为我认为它是一个 SUM 聚合,因为它在子查询中!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
相关资源
最近更新 更多