2016-06-16 2 views
0

Я пытаюсь создать запрос, содержащий левый членский подзапрос, основанный на принципах, которые я узнал в previous question, - которые должны вытаскивать аналогичные наборы данных из двух разных таблиц. Целью является сравнение данных объема на account || platform, чтобы гарантировать, что хранимая процедура, которая создает одну таблицу из другой, делает это правильно.SQL Left Outer Присоединиться к подзапросу

Идея заключается в следующем:

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

Так с этим примером, идея заключается в том, чтобы вытащить все счета и продукты из T1 (таблица процедура действует на) и любых счетов и изделий из Т2 (вновь созданная таблица), где есть совпадение (так, Left Join on T1 = T2). (В идеале все будет идеально сочетаться, без изменений в T1 vs T2 vol и без нулей в томе T2).

Я написал следующий запрос, чтобы выполнить это, но он не совсем работает. Текущая ошибка, которую я получаю, равна not a GROUP BY expression - что я не думаю, что это действительная проблема. Я искал и с итерациями безрезультатно.

Запрос ниже. (Для того, чтобы держать на примере, T1 = OpStats и T2 = 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; 
+0

Возможно, я делаю это слишком простым, но с первого взгляда мне кажется, что есть поле в первом Select, которое не является частью группы? ", RegSplits.Volume RegSplitsVol" –

+0

@DavidW thanks - Я даже не видел этого, потому что я думал об этом как о сборе 'SUM', так как он находится в подзапросе! –

+1

Рад помочь. Похоже, я должен был просто опубликовать это как ответ, но кто-то еще сделал :) LOL –

ответ

0

«Не группа выражением» ошибки очень легко проверить
Просто сравните 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.

+0

спасибо - я даже не видел этого, потому что я думал об этом как о сборе 'SUM', так как он находится в подзапросе! –

Смежные вопросы