SUM FIRST_VALUE или группа SUM, пока все еще отображаются все строки? - PullRequest
0 голосов
/ 29 января 2020

У меня есть таблица, подобная приведенной ниже:

InvoiceNum, CreditNum, ItemID,  TotalCreditDetail, TotalCredit, TotalCost, SumCreditDetailTaxed
001       , 001      , ITEM-A,  340              , 20811      , 20894.84 , 340
001       , 002      , ITEM-B,  0                , 20811      , 20894.84 , 20471
001       , 002      , ITEM-C,  4510             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-D,  1424             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-E,  2230             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-F,  5225             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-G,  3400             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-H,  1242             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-I,  2200             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-J,   240             , 20811      , 20894.84 , 20471

Я пытаюсь получить столбец с «uncategorizedcredit», в основном кредит, не связанный с ItemID. TotalCredit является уникальным для InvoiceNum, поэтому я получу это число, вычтя FIRST_VALUE(TotalCredit) OVER (PARTITION BY InvoiceNum) - SUM(TotalCreditDetail) OVER (PARTITION BY InvoiceNum) as UncategorizedCredit? Я думаю, что, возможно, ответил на мой собственный вопрос о том, как рассчитать UncategorizedCredit, но я не уверен. Я только что нашел FIRST_VALUE сегодня. В настоящее время я использую SUM(CASE WHEN... ) для его расчета, но это грязно и, кажется, требует от меня SUM() с группировкой по, а затем разгруппировкой по, чтобы получить все детали, которые мне нужны для отчета.

После этого мне понадобится СУММИТЬ столбец UncategorizedCredit, чтобы получить итоговую сумму за весь отчет в CrystalReports. Это где немного сложнее, так как отчет сгруппирован по ITEM, а InvoiceNum 002 может иметь ITEM- C, а ITEM-D, InvoiceNum 003 может иметь ITEM-H и ITEM-I, et c. Право теперь я использую переменные для добавления чисел из деталей отчета к итогу. Затем я хотел бы вернуть go и вычесть любой неклассифицированный кредит из общей суммы.

Мой вопрос: как мне добавить это значение для каждого счета к отчету, сгруппированному по ITEM-ID? Я подумал об использовании массива для хранения InvoiceNum того, что я уже суммировал, но максимальные массивы равны 1000, и в этом отчете будет намного больше этого числа.

Я думаю, я мог бы использовать SUM(UncategorizedCredit) OVER() as TotalUncategorizedCredit в новый оператор выбора, выбранный из предыдущего оператора выбора?

Я не могу использовать вложенные операции выбора, поскольку CrystalReports применяет к данным предложение filter / where, а итоговые значения не будут точными. Чтобы получить TotalCreditDetail и SumCreditDetailTaxed, я в настоящее время использую ~ 8-10 СОЕДИНЕНИЙ различных типов, некоторые RIGHT OUTER JOIN (SELECT * FROM table) ON x = y. На самом деле у меня нет SQL передо мной, и я завтра попробую СУММ, но если FIRST_VALUE не сработает, я не уверен, что еще делать.

Это будет возможно, разница составит всего тысячу долларов, но я пытаюсь учесть все.

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Гордон,

Спасибо за ваш ответ. Я не могу использовать группу, потому что мне нужно, чтобы каждая строка была разгруппирована, чтобы показать отдельные элементы в отчете. Однако, напомнив мне, что FIRST_VALUE - то же самое, что MIN / MAX (doh) значительно помогло с моими поисками.

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

    SELECT 
    SUM(CASE WHEN ReportB.RowNum = 1 THEN UncategorizedCredit ELSE 0 END) OVER () as TotalUncategorizedCredit,
    *
FROM (
        SELECT 
            FIRST_VALUE(TotalCredit) OVER (PARTITION BY InvoiceNum ORDER BY InvoiceNum) - SUM(TotalCreditDetail) OVER (PARTITION BY InvoiceNum Order BY InvoiceNum) as UncategorizedCredit,
            ROW_NUMBER() OVER (Partition by InvoiceNum ORDER BY InvoiceNum) as RowNum,
            InvoiceNum,
            CreditNum,
            TotalCreditDetail,
            TotalCredit,
            TotalCost,
            SumCreditDetailTaxed
        FROM (SELECT *  FROM [table]) as Report
) ReportB

Мне нужно было добавить столбец ROW_NUMBER (), разделенный тем же, а затем отфильтровать сумму, используя CASE WHEN, чтобы он добавлялся только при номере строки 1.

Я ценю вашу помощь.

Спасибо, Джаред

0 голосов
/ 29 января 2020

Я думаю, что вы хотите:

select invoicenum,
       (TotalCredit - sum(TotalCreditDetail)) as uncategorizedCredit
from t
group by invoicenum, TotalCredit;

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

select t.*,
       (max(TotalCredit) over (partition by invoicenum) -
        sum(TotalCreditDetail) over (partition by invoicenum)
       ) as uncategorizedCredit
from t;

Вы можете использовать first_value() вместо min() / max() - но последний проще набирать.

...