× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



I had already begun re-writing it attempting to find a way to get rid of
the min(), because I don't like them but usually find them necessary.  I
came up with something similar to yours as below.  Basically PCHL01 and
PCLL01 are header/detail relationship files, and they are also the primary
so they can be joined and grouped in their own temporary file, allowing
everything else to just be reference.  I was skeptical that it would help,
but the program runs in less than a second now.  Thank you for the
assistance.  Now, if I could just get rid of those annoying ifnull's...
thanks again for the suggestions.




     C/EXEC SQL
     C+ declare C1 scroll cursor for
     C+ select PLPRD, PLQTY,
     C+        PLCTN, PLWGT,
     C+        'BULTOS' as PTyp1, 'BUNDLES' as PTyp2,
     C+        GWgt,
     C+        ifnull(FKENGD,' ') as EDSC,
     C+        ifnull(FKSPND,' ') as SDSC,
     C+        ifnull(F5COO,' ') as F5COO,
     C+        ifnull(F2TOUM,' ') as F2TOUM,
     C+        ifnull(HARPMT,' ') as HARPMT,
     C+        ifnull(F5SCST,0), ifnull(F2FACT,1),
     C*        multiply by duty rate percentage
     C+          ifnull(case
     C+            when :FEDATE>=F4COOD
     C+              then 0
     C+            when :FEDATE<F4COOD
     C+              and FLPROF='Y'
     C+              then FLPROR
     C+            when :FEDATE<F4COOD
     C+              and FLPROF<>'Y'
     C+              then FLNORR
     C+            end,0)
     C+
     C+   from
     C+     (select PHCMP, PHFAC, PLPRD, sum(PLQTY) as PLQTY, PLCTN,
     C+             sum(PLWGT) PLWGT, sum(PHCWT)+sum(PLWGT) as GWgt
     C+      from PCHL01 join PCLL01
     C+        on PHCTN=PLCTN
     C+      where PHCONS=:Cons
     C+      group by PHCMP, PHFAC, PLCTN,PLPRD) PrimaryFile
     C+
     C+   left outer join DGF4
     C+     on F4PROD=PLPRD
     C+     and F4CMP=PHCMP
     C+     and F4FAC=PHFAC
     C+   left outer join HARF
     C+     on HARCOD=F4HARM
     C+   left outer join DGF5
     C+     on F5CMP=PHCMP
     C+     and F5Fac=PHFAC
     C+     and F5PROD=PLPRD
     C+   left outer join
     C+      (select F2FRUM, min(F2TOUM) as F2TOUM, min(F2FACT) as F2FACT
     C+        from DGF2 group by F2FRUM) DGF2
     C+     on F2FRUM=F5IUM
     C+   left outer join DGFK
     C+     on FKHARM=F4SUBH
     C+     and FKFAMN=F4FAMN
     C+   left outer join DGFL
     C+     on FLHARM=F4SUBH
     C+
     C+ order by PLCTN, PLPRD
     C/END-EXEC




                                                                           
             "Wilt, Charles"                                               
             <CWilt@xxxxxxxxxx                                             
             om>                                                        To 
             Sent by:                  "Midrange Systems Technical         
             midrange-l-bounce         Discussion"                         
             s@xxxxxxxxxxxx            <midrange-l@xxxxxxxxxxxx>           
                                                                        cc 
                                                                           
             06/23/2005 01:56                                      Subject 
             PM                        RE: SQL scroll cursor slow          
                                       performance                         
                                                                           
             Please respond to                                             
             Midrange Systems                                              
                 Technical                                                 
                Discussion                                                 
             <midrange-l@midra                                             
                 nge.com>                                                  
                                                                           
                                                                           




Simple,

Use a CTE to split out the summary info from the non-summary.

>From your original example,
     C+ with PCHL01Summary as ( select PLPRD, sum(PLQTY) as PLQTY,
     C+                                         PLCTN, sum(PLWGT) as PLWGT
     C+                          from PCHL01
     C+                          group by PLCTN, PLPRD
     C+                          )
     C+ select PLPRD, PLQTY,
     C+        PLCTN, PLWGT,
     C+        'BULTOS' as PTyp1, 'BUNDLES' as PTyp2,
     C+        sum(PHCWT)+sum(PLWGT) as GWgt,
     C+        ifnull(FKENGD,' ') as EDSC,
     C+        ifnull(FKSPND,' ') as SDSC,
     C+        ifnull(F5COO,' ') as F5COO,
     C+        ifnull(F2TOUM,' ') as F2TOUM,
     C+        ifnull(HARPMT,' ') as HARPMT,
     C+        ifnull(F5SCST,0), ifnull(F2FACT,1),
     C*        multiply by duty rate percentage
     C+          ifnull(case
     C+            when :FEDATE>=F4COOD
     C+              then 0
     C+            when :FEDATE<F4COOD
     C+              and FLPROF='Y'
     C+              then FLPROR
     C+            when :FEDATE< F4COOD
     C+              and FLPROF<>'Y'
     C+              then FLNORR
     C+            end,0)
     C+
     C+   from PCHL01Summary join PCLL01
     C+     on PHCTN=PLCTN
     C+   left outer join DGF4
     C+     on F4PROD=PLPRD
     C+     and F4CMP=PHCMP
     C+     and F4FAC=PHFAC
     C+   left outer join HARF
     C+     on HARCOD=F4HARM
     C+   left outer join DGF5
     C+     on F5CMP=PHCMP
     C+     and F5Fac=PHFAC
     C+     and F5PROD=PLPRD
     C+   left outer join DGF2
     C+     on F2FRUM=F5IUM
     C+   left outer join DGFK
     C+     on FKHARM=F4SUBH
     C+     and FKFAMN=F4FAMN
     C+   left outer join DGFL
     C+     on FLHARM=F4SUBH
     C+
     C+   where PHCONS=:Cons
     C+
     C+ order by PLCTN, PLPRD


Can't say for sure this will work as I don't know where all the columns are
coming from.  In particular PHCONS.

But you hopefully you get the idea.


Actually as I rework this, I don't see why you used MIN() in the first
place.  Why didn't you just add all the non-summary fields to the GROUP by
clause?

For example, say you want total shipped by customer and item, it seems this
is what you had:

select B.customerNbr, A.itemNbr, min(A.description), sum(B.qtyShipped)
from itemMaster A
        join orderHist B
   on A.itemNbr = B.shippedItem
group by B.customerNbr, A.itemNbr



but this would have been the correct why to handle it:

select B.customerNbr, A.itemNbr, A.description, sum(B.qtyShipped)
from itemMaster A
        join orderHist B
   on A.itemNbr = B.shippedItem
group by B.customerNbr, A.itemNbr, A.description

As long as you don't have the same item number with 2 different
descriptions.  And if you did, then the MIN() wouldn't work anyway.



HTH,


Charles Wilt
--
iSeries Systems Administrator / Developer
Mitsubishi Electric Automotive America
ph: 513-573-4343
fax: 513-398-1121


> -----Original Message-----
> From: midrange-l-bounces@xxxxxxxxxxxx
> [mailto:midrange-l-bounces@xxxxxxxxxxxx]On Behalf Of darren@xxxxxxxxx
> Sent: Thursday, June 23, 2005 2:06 PM
> To: Midrange Systems Technical Discussion
> Subject: RE: SQL scroll cursor slow performance
>
>
> That's just the nature of SQL.  When you group based on one
> or more fields,
> there will be other fields that aren't part of the grouping
> and you have to
> instruct the query what to do about it.  In other words,
> anytime you use
> GROUP BY, any fields not listed in this list have to have some kind of
> modifier in front of them, like min(), max(), or sum().  I'm
> having trouble
> seeing how common table expressions or a UDF could get around
> that rule.
>
>
>
>
>
>
>              "Wilt, Charles"
>
>              <CWilt@xxxxxxxxxx
>
>              om>
>           To
>              Sent by:                  "Midrange Systems
> Technical
>              midrange-l-bounce         Discussion"
>
>              s@xxxxxxxxxxxx
> <midrange-l@xxxxxxxxxxxx>
>
>           cc
>
>
>              06/23/2005 12:17
>      Subject
>              PM                        RE: SQL scroll cursor
> slow
>                                        performance
>
>
>
>              Please respond to
>
>              Midrange Systems
>
>                  Technical
>
>                 Discussion
>
>              <midrange-l@midra
>
>                  nge.com>
>
>
>
>
>
>
>
>
>
> > -----Original Message-----
> > From: midrange-l-bounces@xxxxxxxxxxxx
> > [mailto:midrange-l-bounces@xxxxxxxxxxxx]On Behalf Of Joe Pluta
> > Sent: Thursday, June 23, 2005 12:38 PM
> > To: 'Midrange Systems Technical Discussion'
> > Subject: RE: SQL scroll cursor slow performance
> >
> >
> > This is a syndrome.  I'm going to name it.  I'm going to call it
> > "creeping SQL-ism".  I think this could be done with a simple
> > read loop
> > and about seven CHAINs.  The wide use of IFNULL and MIN in
> situations
> > where there should only be one record or none makes this statement
> > awfully complex.  And I always start to wonder when I see the CASE
> > keyword.  I have to admit that I'm a bit confused as to how the SQL
> > engine figures out the CASE clause in this statement where different
> > fields are being MIN'd based on the value of a different field's MIN
> > value.
>
> I'm going to have to agree with Joe here.  The use of min()
> when you're
> looking for a minimum value is fine.  The use of min() to
> work around the
> GROUP BY clause is messy.
>
> Some Common Table Expressions or UDF functions (scalar and/or
> table) may be
> of use here.
>
>
> >
> > Poll questions (anybody who feels like it, please answer):
> >
> > 1. Do you think this would require more or less complexity to write
> > using native I/O statements?
>
> In general, about the same.  This particular SQL seems to be
> messier than
> it needs to be.
>
> >
> > 2. What reasons would you give for choosing SQL or native
> > (remember, for
> > performance purposes all the indexes have to exist, so that's not an
> > reason to choose SQL)?
>
> Performance could still be an issue.  But since he's fetching
> one row at a
> time, the OP must not be too concerned about it.  Then again,
> is his asking
> about poor performance here.
>
> In general, if I'm dealing with obvious set at time requirements, I'll
> chose SQL.
>
> In particular, I like to encode "business queries" in a UDF
> table function
> for easier reuse and/or outputting in alternative formats.
>
> >
> > 3. Do you think it would perform better in native or SQL?
>
> When done correctly?  SQL of course.
>
> >
> > 4. Which do you think would take longer to debug?
>
> I find SQL easier; particularly when you use CTE and UDFs to
> break stuff
> down.  It's easy to check the results are what you expect.
> You don't need
> to step thru one line at a time.
>
> However, with an SQL statement this big SQL would be harder.
>
> >
> > 5. Which would be easier to maintain?
>
> see above. the same applies
>
> >
> > (A side issue is to ask why you are running through the exact same
> > cursor four times; where are the report lines going?  One
> of the first
> > things I'd be looking at is how to run through the data once,
> > but that's
> > just my old dinosaur thinking.)
> >
> > Joe
> >
>
> Agreed.  If the only differences are the headers, open 4
> spool files and
> write them all at the same time for crying out loud.
>
> Even with other differences, there's no reason to read the same data 4
> time, just create separate procedures to process that data
> into 4 spool
> files at the same time.
>
>
> Charles Wilt
> --
> iSeries Systems Administrator / Developer
> Mitsubishi Electric Automotive America
> ph: 513-573-4343
> fax: 513-398-1121
>
>
> --
> This is the Midrange Systems Technical Discussion
> (MIDRANGE-L) mailing list
> To post a message email: MIDRANGE-L@xxxxxxxxxxxx
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/midrange-l
> or email: MIDRANGE-L-request@xxxxxxxxxxxx
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/midrange-l.
>
>
>
> --
> This is the Midrange Systems Technical Discussion
> (MIDRANGE-L) mailing list
> To post a message email: MIDRANGE-L@xxxxxxxxxxxx
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/midrange-l
> or email: MIDRANGE-L-request@xxxxxxxxxxxx
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/midrange-l.
>
>

--
This is the Midrange Systems Technical Discussion (MIDRANGE-L) mailing list
To post a message email: MIDRANGE-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/midrange-l
or email: MIDRANGE-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/midrange-l.




As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:
Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.