Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Skills Portfolio

909 views

Published on

Illustrating experience in ETL, OLAP Analysis, Reporting and Dashboards, Software Development, and Scripting

  • Be the first to comment

  • Be the first to like this

Skills Portfolio

  1. 1. Roderick N. Lee <ul><li>Skills Portfolio </li></ul><ul><li>Business Intelligence </li></ul><ul><li>Data Warehousing </li></ul><ul><li>Decision Analysis </li></ul><ul><li>Database Development </li></ul><ul><li>Perl Scripting </li></ul>[email_address] http://www.linkedin.com/in/RoderickNLee (714) 893 8727 H (714) 785 8479 M
  2. 2. Table of Contents <ul><li>Technical Strengths 3 </li></ul><ul><li>ETL 4 </li></ul><ul><li>commercial software (SSIS) 5 </li></ul><ul><li>in-house proprietary 11 </li></ul><ul><li>Data Warehousing and Analysis 14 </li></ul><ul><li>Business Intelligence 19 </li></ul><ul><li>reporting 20 </li></ul><ul><li>dashboards 22 </li></ul><ul><li>Software Development 26 </li></ul><ul><li>Oracle PL/SQL 27 </li></ul><ul><li>Perl 31 </li></ul>
  3. 3. Technical Strengths <ul><li>10+ Years: </li></ul><ul><li>Certification: </li></ul>
  4. 4. ETL <ul><li>10+ Years of Multi-Platform ETL experience: </li></ul><ul><li>Business Objects Data Integrator </li></ul><ul><li>SQL Server Integration Services (SSIS) </li></ul><ul><li>In-house PL/SQL “hand coding” </li></ul>
  5. 5. ETL – Master Control Flow Master control flow populating a small staging database (example using SSIS) It consists of an ETL container calling a set of related external packages utilizing the Execute Package functionality in SSIS, and a series of administrative tasks: backup, database shrink, and index rebuild Each administrative task has a failure e-mail notification along with a final Success task for the entire package
  6. 6. ETL – Package Container Zoom into the package container The process for populating the staging database demonstrates the dependencies between the different dimensional hierarchies. For example, the timesheet load requires both the employee and project loads as prerequisites before it can execute.
  7. 7. ETL – Employee Data Flow Sample Data Flow: Employees In the event of truncation, the process writes these cases to a warning file before reintegrating them into the main flow. The employee data sources from a CSV flatfile and checks for a truncation issue on a new derived column, the full name (consisting of first name appended to last name).
  8. 8. ETL – Employee Data Flow Employee Data Flow (continued) Following the truncation check, the data flow looks up the existing employee table to determine if a given input will be an insert or an update (or an error).
  9. 9. ETL – Timesheets Control Flow This one uses a loop container to read multiple timesheet inputs from the same directory before sending off either a success or failure e-mail notification. Another control flow in the same package
  10. 10. ETL – Slowly Changing Dimensions CDC for Slowly Changing Dimension This example, implementing Change Data Capture, utilizes a Slowly Changing Dimension transform to sort out inserts and updates. Note, the source table for this data flow is the CDC table Another example from a different package for Change Data Capture
  11. 11. ETL – Manual “Hand Coding” <ul><li>In addition, multiple engagements coding manual ETL or data migration solutions in various industries: </li></ul><ul><li>Financial data warehouses for several international and domestic banks </li></ul><ul><li>Entertainment reporting data mart for a top studio </li></ul><ul><li>Clickstream data warehouse (code sample follows) </li></ul><ul><li>Prototyped ETL algorithms for a streaming advertising data warehouse (final product was in Java) </li></ul><ul><li>Loss prevention liability reporting data warehouse for a leading health care provider </li></ul><ul><li>Trigger-based data migration to populate a retail operational data store for a Fortune 500 corporate reseller </li></ul>
  12. 12. ETL – Oracle PL/SQL Clickstream Data Warehouse Source is a Web traffic transactional system. Databases are not linked, so ETL is a combination of Oracle Import/Export (into a staging database) and PL/SQL Packages and Stored Procedures. This procedure calculates several daily clickstream statistics. procedure p_clicks_daily_sum ( p_day_ID in number ) is [...] cursor c_pages_per_hour is select min(count( click_ID )) min_cnt_clicks , max(count( click_ID )) max_cnt_clicks , min(count(distinct URL )) min_cnt_unique_page , max(count(distinct URL )) max_cnt_unique_page , sum(count(distinct URL )) / cn_hours_per_day mean_uq_page_viewed_cnt from com_daily_ssn_details cdsd where com_ID = v_com_ID and click_day_ID = p_day_ID group by click_hour ; Cursor illustrates several calculations for the daily clickstream statistics
  13. 13. ETL – Oracle PL/SQL Daily Clicks Summary Process employs a cursor loop to load the daily clickstream facts by community ID (the top-level dimension) and time begin v_cal_date := mat_stage . get_calendar_date ( p_day_ID ); for r_com in c_communities loop [...] begin insert into clicks_daily_sum values ( p_day_ID , r_com . com_ID , f_get_partition_key ( v_cal_date ) , v_min_cnt_clicks , v_max_cnt_clicks , v_min_cnt_unique_page , v_max_cnt_unique_page , v_mean_uq_page_viewed_cnt , [more columns...] , sysdate ); exception when others then DWH . DWH_process . write_errors ( parameters ); end; end loop; end p_clicks_daily_sum ; (continued)
  14. 14. <ul><li>10+ Years of Data Warehousing experience: </li></ul><ul><li>Business Objects Universe Designer </li></ul><ul><li>SQL Server Analysis Services (SSAS) (examples follow) </li></ul>Data Warehousing and OLAP Analysis Warehouse Implementation and Design in Oracle, SQL Server, Informix and MySQL
  15. 15. Analysis Services The staging database that serves as the data source for the OLAP cube, a result of the preceding SSIS example. The model has five dimensional hierarchies and four fact tables.
  16. 16. Analysis Services OLAP Cube Design This screenshot illustrates the relationships between the five dimensional hierarchies and four fact tables
  17. 17. Analysis Services Calculations and KPIs The calculated member and KPI design tabs Both images highlight the detail behind the KPI for Overhead as a Percentage of Total Cost
  18. 18. Analysis Services – KPI The end result, using Excel as the reporting client, demonstrating Overhead as a Percentage of Total Cost by Jobs
  19. 19. <ul><li>10+ Years of Business Intelligence experience: </li></ul><ul><li>Business Objects WebIntelligence (WebI) </li></ul><ul><li>Business Objects Dashboard Manager </li></ul><ul><li>SQL Server Reporting Services (SSRS) </li></ul><ul><li>PerformancePoint Dashboard Designer </li></ul>Business Intelligence: Query and Reporting (examples follow) (examples follow)
  20. 20. Report Design Overhead Category Report (example using SSRS) The two extra datasets calculate the previous quarter and set the default to the most recent quarter. Note, as this is overhead, negative values for percentage change are good (black) and positive values are bad ( red ).
  21. 21. Simple Tabular Report Overhead Category Report (continued) Basic report showing current and previous quarter’s overhead and the percentage change, accepting the current quarter as an input parameter. Also shows the use of a SharePoint site collection as the distribution medium.
  22. 22. Dashboard Design PerformancePoint Server Dashboard Designer Scorecard with two KPIs, including the same Overhead Percentage as earlier Dashboard design, showing a single filter that links to the scorecard on the left. The Financials scorecard is in the right zone and does not use the filter.
  23. 23. Scorecard Dashboard The final result Again, the distribution medium is SharePoint
  24. 24. Analytic Dashboard Employee Labor Analysis Second example showing both an analytic chart and grid on the same dashboard page. Note, the dual Y-axes that the chart utilizes.
  25. 25. SharePoint Web Part Job Profitability Another dual axis example, this one using Excel Services to display the chart in SharePoint and an Analysis Services Web Part filter
  26. 26. Software Development <ul><li>10+ Years of Software and Database Development experience: </li></ul><ul><li>Radio website content management system using Oracle 8i Application Server </li></ul><ul><li>Perl-based Reporting and ETL system </li></ul>Code Samples:
  27. 27. Oracle Application Server Web Content Management Mock-up of primary page lists all items for each content area of the website procedure magazine_list ( [parameter list] ) is begin -- Piece the dynamic query together. v_query := v_select || v_where || v_ord_grp ; open c_pages for v_query ; fetch c_pages into v_resultset(v_resultset. count +1) ; while not c_pages % NOTFOUND loop fetch c_pages into v_resultset(v_resultset. count +1) ; end loop; v_row_count := DBMS_SQL . last_row_count ; close c_pages ;
  28. 28. Oracle Application Server -- Build the html frame. (does not include the navigation frame) htp.p ( ' <html> <head> <title>Untitled Document</title> <meta http-equiv=&quot;Content-Type“ content=&quot;text/html&quot;> <script language=&quot;JavaScript&quot;> [...] ‘ ); for i in v_first_result .. least ( v_last_result , v_resultset. count ) loop htp.p ( ‘<tr> <td>' || v_title || '</td> <td class=“list_item&quot;>' || v_resultset ( i ). ID || '</td> <td class=“list_item&quot;>' || to_char ( v_resultset ( i ). start_date, 'fmmm/dd/yyyy' ) || '</td> <td class=“list_item&quot;>' || to_char ( v_resultset ( i ). end_date, 'fmmm/dd/yyyy' ) || '</td> <td class=“list_item&quot;>' || v_edit_pvw_del || '</td> </tr>‘ ); end loop; end magazine_list ; Web Content Management (continued)
  29. 29. Oracle Application Server procedure nav_load_and_save_content_mag ( p_graphics_path in varchar2 := cn_graphics_path ) is begin htp.p (' function load_content() { isSelected(''content''); final_form = document.final_page; contentform = top.contentFrame.document.content; for (i=0; i < author_list.length; i++) { contentform.author.options[contentform.author.options.length] = author_list[i]; } preload_select(contentform.author, final_form.P_PGE_CMEM_ID.value); contentform.leadin.value = final_form.P_PGE_LEAD_IN.value; contentform.body.value = final_form.P_PGE_BODY.value; } Web Content Management – Edit Content The actual content management utility employs Javascript to load content text and related data into static HTML subpages
  30. 30. Oracle Application Server function save_content(direction) { final_form = document.final_page; contentform = top.contentFrame.document.content; if (get_selected(contentform.author)!=&quot;&quot;) document.content_change.src=''‘ || p_graphics_path || 'stus_yes.gif''; else document.content_change.src=''‘ || p_graphics_path || 'stus_no.gif''; final_form.P_PGE_CMEM_ID.value = get_selected(contentform.author); final_form.P_PGE_LEAD_IN.value = contentform.leadin.value; rawText = contentform.body.value; encodedText = &quot;&quot;; if (contentform.leadin.value.length >1990) { alert(&quot;The lead-in text area cannot handle more than 2000 characters. Please reduce its size.&quot;); return false; } final_form.P_PGE_BODY.value = encodedText; save_redirect(direction); }' ); end; Web Content Management – Edit Content (continued)
  31. 31. Perl sub a1 { print &quot;<table border='1' bordercolor='#FFFFFF' cellspacing='0' cellpadding='2'>&quot;; [header items] print &quot;</table>&quot;; […] my $sth3 = $dbh->prepare(' SELECT date_id, SUM( registrations ), SUM( ath ), SUM( listeners ), SUM( sessions ), SUM( ads_served ), SUM( ads_missed ) FROM a1 WHERE MONTH(date_ID)= ? AND YEAR(date_ID)= ? GROUP by date_ID ORDER by date_ID DESC') or die &quot;Couldn't prepare statement: &quot; . $dbh->errstr; Perl CGI Report Delivery for Web Streaming Advertising Note, the $dbh handle indicating the use of the DBI module to handle database agnostic SQL functionality
  32. 32. Perl <ul><ul><li>while (@data3 = $sth3->fetchrow_array()) </li></ul></ul><ul><ul><li>{ $reg_tot = $reg_tot + $data3[1]; </li></ul></ul><ul><li> $ath_tot = $ath_tot + $data3[2]; </li></ul><ul><li> $listeners_tot = $listeners_tot + $data3[3]; </li></ul><ul><li> $sessions_tot = $sessions_tot + $data3[4]; </li></ul><ul><li> $ads_served_tot = $ads_served_tot + $data3[5]; </li></ul><ul><li>$rowcount + rowcount + 1; </li></ul><ul><li>} </li></ul><ul><li>print &quot;<TR>&quot;; </li></ul><ul><ul><li>print &quot;<TD align='center' ><B>Total</B></TD>&quot;; </li></ul></ul><ul><li>print &quot;<TD align='right' ><B>$reg_tot</TD></B>&quot;; </li></ul><ul><li>print &quot;<TD align='right' ><B>$ath_tot</TD></B>&quot;; </li></ul><ul><li>print &quot;<TD align='right' ><B>$listeners_tot</TD></B>&quot;; </li></ul><ul><li>print &quot;<TD align='right' ><B>$sessions_tot</TD></B>&quot;; </li></ul><ul><li>print &quot;<TD align='right' ><B>$ads_served_tot</TD></B>&quot;; </li></ul><ul><li>print &quot;</TR>&quot;; </li></ul><ul><li>if ($sth3->rows == 0) </li></ul><ul><li>{ $nodata = &quot;No Data Found in Daily Report.&quot;;} </li></ul><ul><li>$sth3->finish; </li></ul><ul><li>$dbh->disconnect; </li></ul><ul><li>print &quot;</table>&quot;; </li></ul><ul><li>} </li></ul>Perl CGI Report Delivery (continued)

×