【问题标题】:Aggregate functions in Progress OpenEdge 10.2B正在进行的聚合函数 OpenEdge 10.2B
【发布时间】:2014-01-25 00:33:12
【问题描述】:

我的任务是将存储过程从 SQL Server 转换为 Progress 代码。

一切都很顺利,但我昨天遇到了一个谜。

我们如何在OpenEdge V10.2B 中进行Min、Max、Avg 等聚合函数?

这里是一个 SQL Server 场景:

WITH Inventory (ItemNo, Quantity)
AS
(
          SELECT 'ItemA', 100
    UNION SELECT 'ItemA', 200
    UNION SELECT 'ItemC', 300
    UNION SELECT 'ItemB', 400
    UNION SELECT 'ItemA', 500
    UNION SELECT 'ItemB', 600
)
SELECT
    ItemNo
    ,MIN(Quantity)   AS Min1
    ,MAX(Quantity)   AS Max1
    ,AVG(Quantity)   AS Avg1
    ,SUM(Quantity)   AS Sum1
    ,COUNT(Quantity) AS Count1
FROM Inventory
GROUP BY
    ItemNo

结果是:

ItemNo   Min1    Max1    Avg1    Sum1     Count1
ItemA    100     500     266     800      3
ItemB    400     600     500     1000     2
ItemC    300     300     300     300      1

谢谢你, 祝你有美好的一天! 塞巴斯蒂安

【问题讨论】:

    标签: progress-4gl


    【解决方案1】:

    好的,我喜欢挑战。所以,这里是使用 Progress 的内置聚合函数的解决方案。

    首先,一些家务:设置临时表并填充它:

    DEFINE TEMP-TABLE ttTest
        FIELD ItemNo AS CHARACTER
        FIELD Quantity AS INTEGER
        INDEX ItemNo ItemNo.
    
    RUN ipCreateTest("ItemA",100).
    RUN ipCreateTest("ItemA",200).
    RUN ipCreateTest("ItemC",300).
    RUN ipCreateTest("ItemB",400).
    RUN ipCreateTest("ItemA",500).
    RUN ipCreateTest("ItemB",600).
    
    PROCEDURE ipCreateTest:
    DEFINE INPUT  PARAMETER pcItem AS CHARACTER   NO-UNDO.
    DEFINE INPUT  PARAMETER piQty  AS INTEGER     NO-UNDO.
    
    CREATE ttTest.
    ASSIGN
        ttTest.ItemNo = pcItem
        ttTest.Quantity = piQty
        .
    END.
    

    然后,实际的报告部分:

    FOR EACH ttTest
        NO-LOCK
        BREAK BY ttTest.ItemNo:
        ACCUMULATE ttTest.Quantity
            (MINIMUM MAXIMUM AVERAGE TOTAL COUNT BY ttTest.Itemno).
        IF LAST-OF(ttTest.itemNo) THEN DO:
            DISPLAY
                ttTest.ItemNo
                ACCUM MINIMUM BY ttTest.ItemNo ttTest.Quantity
                    COLUMN-LABEL "Min1"
                ACCUM MAXIMUM BY ttTest.ItemNo ttTest.Quantity
                    COLUMN-LABEL "Max1"
                ACCUM AVERAGE BY ttTest.ItemNo ttTest.Quantity
                    COLUMN-LABEL "Avg1"
                ACCUM TOTAL BY ttTest.ItemNo ttTest.Quantity
                    COLUMN-LABEL "Sum1"
                ACCUM COUNT BY ttTest.ItemNo ttTest.Quantity
                    COLUMN-LABEL "Count1"
                .
        END.
    END.
    

    内置函数有效,但语法非常违反直觉恕我直言。我会采用 Tim 的解决方案,主要是因为我可能会在使用 ACCUM 和 ACCUMULATE 进行第二次迭代时完成该策略的问题,弄清楚括号的位置...... :)

    【讨论】:

    • 感谢你的努力——这段代码对我来说真的很有意义! :)
    • 谢谢!我正在寻找相当于 SQL Server 的东西,似乎就是这样。如果我使用这段代码而不是 Tim 代码,我会被其他程序员杀死吗?
    • 谁必须在你可能之后维护代码......我的代码更容易弄清楚。 :)
    【解决方案2】:

    这将为您提供您正在寻找的 ItemNo 值:

        DEFINE VARIABLE iMin    AS INTEGER      NO-UNDO.
        DEFINE VARIABLE iMax    AS INTEGER      NO-UNDO.
        DEFINE VARIABLE iTotal  AS INTEGER      NO-UNDO.
        DEFINE VARIABLE iCount  AS INTEGER      NO-UNDO.
    
    
        FOR EACH Inventory
            NO-LOCK
            BREAK BY Inventory.itemno
            :
    
            IF FIRST-OF(Inventory.itemno) THEN
                ASSIGN
                    iMin    = 99999999
                    iMax    = -99999999
                    iTotal  = 0
                    iCount  = 0
                    .
    
            ASSIGN
                iMin    = MIN(iMin, inventory.quantity)
                iMax    = MAX(iMax, inventory.quantity)
                iTotal  = iTotal + inventory.quantity 
                iCount  = iCount + 1
                .
    
            IF LAST-OF(Inventory.itemno) THEN
                DISPLAY
                        Inventory.itemno
                        iMin
                        iMax
                        iTotal / iCount
                        iTotal
                        iCount
                    WITH FRAME f-show
                        DOWN
                        .
    
        END.
    

    【讨论】:

    • Progress 确实具有对休息组进行总计、计数、平均等的功能,但我发现与明确说明相比,使用它们更难。
    • 对于每个库存 NO-LOCK
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多