Проблема с запросом с помощью SUM / Group By - PullRequest
0 голосов
/ 28 июня 2011

У меня есть запрос Oracle SQL, с помощью которого я хочу разделить итоги нескольких столбцов суммы и некоторых описательных столбцов. Короче говоря, я хочу вывод, как:

INDBDebnmbr INInvoicenmbr INOpenAmount
40          10            100
40          14            125
35          20            200
60          21            75

Моя строка запроса:

SELECT TRIM(A.ACCOUNTNUMBER) AS INDBDebnmbr
     , TRIM(A.VOUCHER) AS INinvoicenmbr
     , A.DATE_ AS INinvoiceDate
     , A.DUEDATE AS INinvoiceDueDate
     , A.TXT AS INDescription
     , A.EXCHANGECODE AS INCurrencyCode
     , subq.AMOUNTMST AS INOriginalamount
     , subq.SETTLEAMOUNTMST AS INpaidAmount
     , subq.OPENAMOUNT AS INOpenAmount
FROM (
            SELECT  DEBTRANS.VOUCHER AS VOUCHER, 
                    SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST, 
                    SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST, 
                    SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
            FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
            WHERE DEBTRANS.OPEN = 1 
            AND DEBTRANS.TRANSTYPE <> 9 
            AND (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 
            AND DEBTRANS.DATASET = 'FIK'
            GROUP BY DEBTRANS.VOUCHER
        ) subq, 
       XAL_SUPERVISOR.DEBTRANS A 
WHERE subq.VOUCHER = A.VOUCHER 
GROUP BY    A.VOUCHER, 
            A.ACCOUNTNUMBER,
            A.DATE_, 
            A.DUEDATE, 
            A.TXT, 
            A.EXCHANGECODE,
            subq.AMOUNTMST, 
            subq.SETTLEAMOUNTMST, 
            subq.OPENAMOUNT

Я, однако, получаю

INDBDEBNMBR   ININVOICENMBR  ININVOICEDATE  ININVOICEDUEDATE INOPENAMOUNT
10            2022903        12-2-2011 0:00 24-2-2011 0:00   110
35            2022903        11-2-2011 0:00 23-2-2011 0:00   110
20            2022903        17-2-2011 0:00 1-3-2011 0:00    110
10            2022903        14-2-2011 0:00 26-2-2011 0:00   110
29211         2022903        14-2-2011 0:00 26-2-2011 0:00   11

Как мне получить правильные SUMS от DEBTRANS.VOUCHER с описательными столбцами?

Заранее спасибо,

Mike

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Вы без необходимости присоединяетесь к таблице, чтобы получить дополнительные столбцы. Я предполагаю, что проблема в том, что вы не повторяете условия фильтра для внешнего экземпляра таблицы.

Делает ли это то, что вы хотите?

        SELECT  DEBTRANS.VOUCHER AS VOUCHER, 
                SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST, 
                SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST, 
                SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
                TRIM(DEBTRANS.ACCOUNTNUMBER) AS INDBDebnmbr
              , DEBTRANS.DATE_ AS INinvoiceDate
              , DEBTRANS.DUEDATE AS INinvoiceDueDate
              , DEBTRANS.TXT AS INDescription
              , DEBTRANS.EXCHANGECODE AS INCurrencyCode
        FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
        WHERE DEBTRANS.OPEN = 1 
        AND DEBTRANS.TRANSTYPE <> 9 
        AND (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 
        AND DEBTRANS.DATASET = 'FIK'
        GROUP BY DEBTRANS.VOUCHER
                ,DEBTRANS.ACCOUNTNUMBER
                ,DEBTRANS.DATE_
                ,DEBTRANS.DUEDATE
                ,DEBTRANS.TXT
                ,DEBTRANS.EXCHANGECODE

Если нет, то, вероятно, один или несколько из этих дополнительных столбцов не имеют уникального значения в ваучере. В этом случае вам нужно решить, как вы хотите выбрать, какое значение отображать для каждой группы. Например, вы можете выбрать максимальное значение, как показано ниже, но имеет ли это смысл для вашей бизнес-логики?

        SELECT  DEBTRANS.VOUCHER AS VOUCHER, 
                SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST, 
                SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST, 
                SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
                MAX(TRIM(DEBTRANS.ACCOUNTNUMBER)) AS INDBDebnmbr
              , MAX(DEBTRANS.DATE_) AS INinvoiceDate
              , MAX(DEBTRANS.DUEDATE) AS INinvoiceDueDate
              , MAX(DEBTRANS.TXT) AS INDescription
              , MAX(DEBTRANS.EXCHANGECODE) AS INCurrencyCode
        FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
        WHERE DEBTRANS.OPEN = 1 
        AND DEBTRANS.TRANSTYPE <> 9 
        AND (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 
        AND DEBTRANS.DATASET = 'FIK'
        GROUP BY DEBTRANS.VOUCHER
0 голосов
/ 28 июня 2011

В подзапросе subq добавить еще одно условие в WHERE caluse

AND DEBTRANS.VOUCHER = A.VOUCHER

Это означает, что ваучер основного запроса должен соответствовать номеру ваучера подзапроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...