• The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
Menu
  • The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
  • Let One Row Represent a Group, Take 2

    October 27, 2010 Ted Holt

    Let’s return to a problem I wrote about a few months ago. The technique I illustrated in that article works for most implementations of SQL. Today it’s my pleasure to share a technique you can use with versions of SQL that include certain OLAP functions, such as DB2 for i V5R4 or above.

    You’ve been asked to list customer orders that have not been fully shipped, but you are to only show the first unshipped line of each order. Use the RANK() function to assign a sequential number to each row for each order, like this:

    select OrderNo, LineNo, QtyOrdered - QtyShipped as Balance,
           substr(char(CrtTime), 1, 16) as TimeEntered,
           rank() over
              (partition by OrderNo order by CrtTime) as OrderRank
         from salesordd
        where QtyShipped < QtyOrdered
    
    • RANK() OVER means that SQL is to number the rows.
    • ORDER BY CrtTime means that the rows are to be numbered in sequence according to the CrtTime field.
    • PARTITION BY OrderNo means that the numbering is to restart at 1 for each order number. Without PARTITION BY, the entire result set would be numbered in one sequence.

    This is the result set:

    ORDERNO  LINENO   BALANCE   TIMEENTERED       ORDERRANK
        101      2         12   2010-04-21-11.15          1
        102      1          5   2010-04-21-10.05          1
        102      2        100   2010-04-21-10.15          2
        103      3          5   2010-04-21-14.37          1
        105      2          6   2010-04-21-10.30          1
    

    Notice that there are two unshipped lines for order 102. In order to get only one line per order, you must select the rows with a rank value of 1. However, it is not permitted to refer to the ranking column in the WHERE clause. To get around this limitation, put the result set into something temporary, such as a common table expression:

    with Temp as 
      (select d.*, 
              rank() over
                (partition by OrderNo order by CrtTime) as OrderRank
         from salesordd as d
        where QtyShipped < QtyOrdered)
        
    select t.OrderNo, t.LineNo, t.QtyOrdered, t.QtyShipped,
           (t.QtyOrdered - t.QtyShipped) as Balance, t.Price,
           (t.QtyOrdered - t.QtyShipped) * t.Price as Extended,
           substr(char(t.crttime), 1, 16) as TimeEntered 
      from temp as t
     where t.OrderRank = 1
    

    Or a derived table:

    select t.OrderNo, t.LineNo, t.QtyOrdered, t.QtyShipped,
           (t.QtyOrdered - t.QtyShipped) as Balance, t.Price,
           (t.QtyOrdered - t.QtyShipped) * t.Price as Extended,
           substr(char(t.crttime), 1, 16) as TimeEntered
      from 
      (select d.*,
              rank() over
                (partition by OrderNo order by CrtTime) as OrderRank
         from salesordd as d
        where QtyShipped < QtyOrdered) as t
     where t.OrderRank = 1
    

    Either way, here’s the result set:

    ORDER  LINE  ORDERED  SHIPPED   BALANCE   PRICE  EXTENDED  TIMEENTERED
      101    2        12        0        12    1.00     12.00  2010-04-21-11.15
      102    1        10        5         5    2.00     10.00  2010-04-21-10.05
      103    3         5        0         5    1.10      5.50  2010-04-21-14.37
      105    2         6        0         6    2.00     12.00  2010-04-21-10.30
    

    RELATED STORIES

    Let One Row Represent a Group

    New in V5R4: OLAP Ranking Specifications



                         Post this story to del.icio.us
                   Post this story to Digg
        Post this story to Slashdot

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Tags:

    Sponsored by
    DRV Tech

    Get More Out of Your IBM i

    With soaring costs, operational data is more critical than ever. IBM shops need faster, easier ways to distribute IBM applications-based data to users more efficiently, no matter where they are.

    The Problem:

    For Users, IBM Data Can Be Difficult to Get To

    IBM Applications generate reports as spooled files, originally designed to be printed. Often those reports are packed together with so much data it makes them difficult to read. Add to that hardcopy is a pain to distribute. User-friendly formats like Excel and PDF are better, offering sorting, searching, and easy portability but getting IBM reports into these formats can be tricky without the right tools.

    The Solution:

    IBM i Reports can easily be converted to easy to read and share formats like Excel and PDF and Delivered by Email

    Converting IBM i, iSeries, and AS400 reports into Excel and PDF is now a lot easier with SpoolFlex software by DRV Tech.  If you or your users are still doing this manually, think how much time is wasted dragging and reformatting to make a report readable. How much time would be saved if they were automatically formatted correctly and delivered to one or multiple recipients.

    SpoolFlex converts spooled files to Excel and PDF, automatically emailing them, and saving copies to network shared folders. SpoolFlex converts complex reports to Excel, removing unwanted headers, splitting large reports out for individual recipients, and delivering to users whether they are at the office or working from home.

    Watch our 2-minute video and see DRV’s powerful SpoolFlex software can solve your file conversion challenges.

    Watch Video

    DRV Tech

    www.drvtech.com

    866.378.3366

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Sponsored Links

    PowerTech:  FREE Webinar! Protect IBM i Data from FTP, ODBC, & Remote Command. Nov. 3, 10 am CT
    iSeries DevCon2010:  Get 3 days of IBM i training and 365 DAYS OF VALUE, Nov 15-17, Las Vegas
    Bsafe Information Systems:  Webcast: Top 5 System i Vulnerabilities. Oct 27. 2 p.m. EST

    IT Jungle Store Top Book Picks

    BACK IN STOCK: Easy Steps to Internet Programming for System i: List Price, $49.95

    The iSeries Express Web Implementer's Guide: List Price, $49.95
    The iSeries Pocket Database Guide: List Price, $59
    The iSeries Pocket SQL Guide: List Price, $59
    The iSeries Pocket WebFacing Primer: List Price, $39
    Migrating to WebSphere Express for iSeries: List Price, $49
    Getting Started with WebSphere Express for iSeries: List Price, $49
    The All-Everything Operating System: List Price, $35
    The Best Joomla! Tutorial Ever!: List Price, $19.95

    Fiserv Unveils New Release of Core Banking Platform Windows Loses to Power 720-IBM i Combo, But Whips Power 750s

    Leave a Reply Cancel reply

Volume 10, Number 33 -- October 27, 2010
THIS ISSUE SPONSORED BY:

ProData Computer Services
WorksRight Software
inFORM Decisions

Table of Contents

  • DDS Design: The RD Power Way
  • Let One Row Represent a Group, Take 2
  • Printing Multiple PC5250 Screens at the Same Time

Content archive

  • The Four Hundred
  • Four Hundred Stuff
  • Four Hundred Guru

Recent Posts

  • The Power11 Transistor Count Discrepancies Explained – Sort Of
  • Is Your IBM i HA/DR Actually Tested – Or Just Installed?
  • Big Blue Delivers IBM i Customer Requests In ACS Update
  • New DbToo SDK Hooks RPG And Db2 For i To External Services
  • IBM i PTF Guide, Volume 27, Number 33
  • Tool Aims To Streamline Git Integration For Old School IBM i Devs
  • IBM To Add Full System Replication And FlashCopy To PowerHA
  • Guru: Decoding Base64 ASCII
  • The Price Tweaking Continues For Power Systems
  • IBM i PTF Guide, Volume 27, Numbers 31 And 32

Subscribe

To get news from IT Jungle sent to your inbox every week, subscribe to our newsletter.

Pages

  • About Us
  • Contact
  • Contributors
  • Four Hundred Monitor
  • IBM i PTF Guide
  • Media Kit
  • Subscribe

Search

Copyright © 2025 IT Jungle