SQL Выберите несколько объединений и MAX (поле) результат - PullRequest
0 голосов
/ 15 января 2019

Я использую IBM Cognos для создания отчета, который допускает довольно стандартный SQL. В конечном итоге я пытаюсь взять данные из двух таблиц и сравнить их друг с другом, чтобы убедиться, что они совпадают. Billing_Term, Bill_Period и Contract_Term_Amount должны совпадать при сравнении заданного Contract_Number, Contract_Item и Stream_Type между t1 и t3, но только для MAX Seq_No от t3.

Я попробовал простой MAX () для Seq_No, но это не сработало, поэтому я ищу помощь в ограничении результатов до MAX Seq_No для связанных результатов запроса.



    SELECT
        t1.Contract_Number, 
        t1.Contract_Item, 
        t1.Stream_Type, 
        t1.Billing_Term, 
        t1.Bill_Period, 
        t1.Contract_Term_Amount,
        t2.Reference_Document,
        t3.Billing_Term,
        t3.Bill_Period,
        t3.Contract_Term_Amount,
        t3.Seq_No
    FROM
        LeasingStreamData t1 
    INNER JOIN ContractsData t2 ON t1.Contract_Number = t2.Sales_Document
    LEFT JOIN LeasingStreamData t3 ON t2.Reference_Document = t3.Contract_Number AND
        t1.Contract_Item = t3.Contract_Item AND
        t1.Stream_Type = t3.Stream_Type
    WHERE 
    t1.Contract_Number IN ([some list of contracts])
    GROUP BY 
        t1.Contract_Number, 
        t1.Contract_Item, 
        t1.Stream_Type, 
        t1.Billing_Term, 
        t1.Bill_Period, 
        t1.Contract_Term_Amount,
        t2.Reference_Document,
        t3.Billing_Term,
        t3.Bill_Period,
        t3.Contract_Term_Amount,
        t3.Seq_No

Надеюсь, этого достаточно, чтобы получить столь необходимую помощь, большое спасибо за любую помощь, которую вы можете оказать!

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Попробуйте это:

SELECT t1.Contract_Number
    ,t1.Contract_Item
    ,t1.Stream_Type
    ,t1.Billing_Term
    ,t1.Bill_Period
    ,t1.Contract_Term_Amount
    ,t2.Reference_Document
    ,t3.Billing_Term
    ,t3.Bill_Period
    ,t3.Contract_Term_Amount
    ,t3.Seq_No
FROM LeasingStreamData t1
INNER JOIN ContractsData t2 ON t1.Contract_Number = t2.Sales_Document
LEFT JOIN (
    SELECT Contract_Number
        ,Contract_Item
        ,Stream_type
        ,MAX(Seq_No) AS "Seq_No"
    FROM LeasingStreamData
    GROUP BY Contract_Number
        ,Contract_Item
        ,Stream_Type
    ) t3 ON t2.Reference_Document = t3.Contract_Number
    AND t1.Contract_Item = t3.Contract_Item
    AND t1.Stream_Type = t3.Stream_Type
WHERE t1.Contract_Number IN ([some list of contracts])

Поскольку накопительный пакет для агрегирующей функции (MAX) использует группу для определения контекста, его необходимо изолировать с помощью подзапроса, чтобы получить максимальное значение, прежде чем присоединяться к остальным таблицам.

Кроме того, поскольку вы предварительно агрегируете максимальный порядковый номер, вам больше не нужна группа в основном запросе.

0 голосов
/ 15 января 2019

Если я понимаю ваше требование, я думаю, что вы хотите создавать запросы и объединять их так, чтобы это выглядело так: SQL:

SELECT
  t1.Contract_Number
, t1.Contract_Item
, t1.Stream_Type
, t1.Billing_Term
, t1.Bill_Period
, t1.Contract_Term_Amount
, t2.Reference_Document
, t3.Billing_Term
, t3.Bill_Period
, t3.Contract_Term_Amount
, t3.Seq_No

FROM (
    SELECT Contract_Number
    , Contract_Item
    , Stream_Type
    , Billing_Term
    , Bill_Period
    , Contract_Term_Amount
    FROM LeasingStreamData
    WHERE Contract_Number in ([some list of contracts])
  ) t1 
  INNER JOIN (
    SELECT Sales_Document
    , Reference_Document
    FROM ContractsData
    WHERE Sales_Document in ([some list of contracts])
  ) t2 ON t1.Contract_Number = t2.Sales_Document
  INNER JOIN LeasingStreamData t3 ON t2.Reference_Document = t3.Contract_Number 
                               AND t1.Contract_Item = t3.Contract_Item 
                               AND t1.Stream_Type = t3.Stream_Type
  INNER JOIN (
      select max(Seq_No) as Seq_No
      , Contract_Number
      , Contract_Item
      , Stream_Type
      from LeasingStreamData lsd
      group by Contract_Number
      , Contract_Item
      , Stream_Type
  ) maxseq on maxseq.Contract_Number = t3.Contract_Number
          and maxseq.Contract Item = t3.Contract_Item
          and maxseq.Stream_Type = t3.Stream_Type
          and maxseq.Seq_No = t3.Seq_No

WHERE t1.Billing_Term <> t3.Billing_Term
  and t1.Bill_Period <> t3.Bill_Period
  and t1.Contract_Term_Amount <> t3.Contract_Term_Amount

GROUP BY 
  t1.Contract_Number
, t1.Contract_Item
, t1.Stream_Type
, t1.Billing_Term
, t1.Bill_Period
, t1.Contract_Term_Amount
, t2.Reference_Document
, t3.Billing_Term
, t3.Bill_Period
, t3.Contract_Term_Amount
, t3.Seq_No

Я думаю, что это отфильтрует только максимальное значение Seq_No для t3 и вернет только записи, которые вас интересуют (те, которые не совпадают).

...