tag:blogger.com,1999:blog-57736629413852361232024-03-08T07:07:49.588-08:00Develop jasper reports efficiently with esProcJerryhttp://www.blogger.com/profile/08883279980468748132noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-5773662941385236123.post-4905093167634171622019-05-14T03:22:00.001-07:002019-05-14T03:22:11.009-07:00How to Use esProc to Assist Reporting Tools<div style="color: #333333; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">Both SQL and Birt scripts can handle the group operation. In SQL, usually we can only group a table automatically according to its own filed(s). When the grouping criterion comes from another table, or is an external parameter or a conditional list, SQL has to handle the grouping in a very roundabout way. Some cases even require the dynamic criteria, which needs to be implemented by writing complicated report scripts. For some other cases, where the grouping criterion doesn’t entirely correspond to the source table (or the intervals involved don’t have any intersection), either the grouping result should be complemented or the difference should be excluded from it. Both scenarios are difficult to deal with in SQL or with the report script.</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">With support of alignment grouping, enumeration grouping, and order-related computations, esProc can easily implement those scenarios of non-equi-grouping. That’s why it is a best choice for preparing data needed for report creation. Birt/Jasper ,the reporting tool regards an esProc script as the stored procedure, passes parameter to it and gets the returned result after execution through JDBC. You can learn more from <strong style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><a href="http://blog.raqsoft.com/?p=4665" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;">How to Use esProc to Assist Reporting Tools</a></em></strong>.</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">Here are some typical problems involving non-equi-grouping in SQL development and their solutions in esProc.</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<strong style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;">Simple fixed grouping</span></strong></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">sales</em> table stores ordering records, in which CLIENT column holds the client names and AMOUNT column has ordering amounts. For the report, we need to group the table according to the list of “potential clients” and to aggregate the AMOUNT column in each group. The list is an external parameter and contains some items that the CLIENT column doesn’t (Their aggregation results should be zero). Now suppose the list is TAS,BON,CHO,ZTOZ . Below is a selection of the source data:</span></div>
<table border="1" cellspacing="0" style="border-collapse: collapse; border: none; font-size: 16px; margin-left: -9pt; width: 482pt;"><tbody>
<tr style="height: 26.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 98.1000pt;" valign="top" width="163"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b><span class="15" style="color: #333333; letter-spacing: 0pt;">OrderID</span></b><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 80.8500pt;" valign="top" width="134"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b><span class="15" style="color: #333333; letter-spacing: 0pt;">Client</span></b><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 94.6000pt;" valign="top" width="157"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b><span class="15" style="color: #333333; letter-spacing: 0pt;">SellerId</span></b><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 95.5000pt;" valign="top" width="159"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b><span class="15" style="color: #333333; letter-spacing: 0pt;">Amount</span></b><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 112.9500pt;" valign="top" width="188"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b><span class="15" style="color: #333333; letter-spacing: 0pt;">OrderDate</span></b><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 26.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 98.1000pt;" valign="top" width="163"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">26</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 80.8500pt;" valign="top" width="134"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">TAS</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 94.6000pt;" valign="top" width="157"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 95.5000pt;" valign="top" width="159"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2142.4</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 112.9500pt;" valign="top" width="188"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2009/8/5</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 26.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 98.1000pt;" valign="top" width="163"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">33</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 80.8500pt;" valign="top" width="134"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">DSGC</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 94.6000pt;" valign="top" width="157"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 95.5000pt;" valign="top" width="159"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">613.2</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 112.9500pt;" valign="top" width="188"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2009/8/14</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 26.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 98.1000pt;" valign="top" width="163"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">84</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 80.8500pt;" valign="top" width="134"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">GC</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 94.6000pt;" valign="top" width="157"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 95.5000pt;" valign="top" width="159"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">88.5</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 112.9500pt;" valign="top" width="188"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2009/10/16</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 26.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 98.1000pt;" valign="top" width="163"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">133</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 80.8500pt;" valign="top" width="134"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">HU</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 94.6000pt;" valign="top" width="157"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 95.5000pt;" valign="top" width="159"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">1419.8</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 112.9500pt;" valign="top" width="188"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2010/12/12</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 26.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 98.1000pt;" valign="top" width="163"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">32</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 80.8500pt;" valign="top" width="134"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">JFS</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 94.6000pt;" valign="top" width="157"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">3</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 95.5000pt;" valign="top" width="159"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">468</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 112.9500pt;" valign="top" width="188"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2009/8/13</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 26.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 98.1000pt;" valign="top" width="163"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">39</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 80.8500pt;" valign="top" width="134"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">NR</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 94.6000pt;" valign="top" width="157"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">3</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 95.5000pt;" valign="top" width="159"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">3016</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 112.9500pt;" valign="top" width="188"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2010/8/21</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 27.5000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 98.1000pt;" valign="top" width="163"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">43</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 80.8500pt;" valign="top" width="134"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">KT</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 94.6000pt;" valign="top" width="157"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">3</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 95.5000pt;" valign="top" width="159"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2169</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 112.9500pt;" valign="top" width="188"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;"><span style="font-size: small;">2009/8/27</span></span><span style="color: #333333; font-size: 9.5pt; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
</tbody></table>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">When the grouping criterion is fixed and contains relatively few items, you can have union or decode work with SQL to perform the group. As with this example, the grouping criterion is a dynamic external parameter. We have to create a temporary table, parse each value of the parameter and insert the results into the temporary table before moving on to the subsequent computations. But with esProc, we don’t need to create a temporary table. Here’s the esProc code:</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105320.jpg" rel="attachment wp-att-2341" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;"><img alt="2016-03-09_105320" class="aligncenter size-full wp-image-2341" data-attachment-id="2341" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105320" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105320.jpg?w=294" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105320.jpg?w=294" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105320.jpg" data-orig-size="294,109" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105320/" sizes="(max-width: 294px) 100vw, 294px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105320.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105320.jpg 294w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105320.jpg?w=150 150w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></span></a></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">align</em> function groups records by <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">arg1</em>, the external parameter list, and uses @a option to get all records from each group; without @a, the function will get the first record of each group. The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">pjoin</em> function composes each record in order, as shown below:</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105331.jpg" rel="attachment wp-att-2342" style="background: transparent; border: 0px; color: #ff4b33; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;"><img alt="2016-03-09_105331" class="aligncenter size-full wp-image-2342" data-attachment-id="2342" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105331" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105331.jpg?w=296" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105331.jpg?w=296" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105331.jpg" data-orig-size="296,99" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105331/" sizes="(max-width: 296px) 100vw, 296px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105331.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105331.jpg 296w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105331.jpg?w=150 150w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></span></a></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<strong style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;">Dynamic aggregate by intervals</span></strong></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">Suppose we want to segment the <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">sales</em> table according to the ordering amounts and aggregate the amounts for each segment in the report. The criterion of segmentation is a list parameter, which includes multiple items, such as four intervals separated by 0-1000, 1000-2000 and 2000-4000.</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">With a fixed criterion, we can write it directly in the SQL statement. But with a dynamic external parameter, we often need to compose the SQL statement using a report script, a high-level language such as JAVA. The process could be very complicated. esProc, however, supports the dynamic expression to produce smart code:</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105353.jpg" rel="attachment wp-att-2343" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;"><img alt="2016-03-09_105353" class="aligncenter size-full wp-image-2343" data-attachment-id="2343" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105353" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105353.jpg?w=293" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105353.jpg?w=293" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105353.jpg" data-orig-size="293,83" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105353/" sizes="(max-width: 293px) 100vw, 293px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105353.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105353.jpg 293w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105353.jpg?w=150 150w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></span></a></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">byFac</em> is a parameter, like [“?<=1000″ ,”?>1000 && ?<=2000″,”?>2000 && ?<=4000″,”?>4000″]. The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">enum</em> function groups records according to the criterion. Here’s the result:</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105405.jpg" rel="attachment wp-att-2344" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;"><img alt="2016-03-09_105405" class="aligncenter size-full wp-image-2344" data-attachment-id="2344" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105405" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105405.jpg?w=379" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105405.jpg?w=300" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105405.jpg" data-orig-size="379,101" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105405/" sizes="(max-width: 379px) 100vw, 379px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105405.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105405.jpg 379w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105405.jpg?w=150 150w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105405.jpg?w=300 300w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></span></a></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">It happens that the above conditional intervals don’t overlap each other. But in practice it’s not uncommon to have overlapped conditions. For instance, suppose we want to group the ordering amounts according to the following rules:</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">1000 ~ 4000: Regular orders</span></div>
<div style="background:border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">Below 2000: Common orders</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">Above 3000: Important orders</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">Among these conditions, r1 and r2 overlap each other. Sometimes we don’t want duplicate records in the grouping result (that is, after finding records satisfying r1, then find records satisfying r2 from the rest of the records). Other times we do want the duplicate records (find records satisfying each condition from the whole table). For both scenarios, SQL needs a great amount of <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">with</em>, <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">union</em>, <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">except</em> or <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">minus</em> statements to produce extremely lengthy code. By default, the esProc <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">enum</em> function performs groups without duplicates; but it also allows them by using @r option.</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<strong style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;">Dynamic accumulation by intervals</span></strong></div>
<div style="background:border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">performance</em> table holds the performance scores and performance bonuses of employees. Starting from zero, we divide the performance scores every 10 scores and then, from low to high, aggregate the bonuses cumulatively section by section. That is, the accumulated amount of the current section should cover the bonuses of all previous sections. Below is the source data:</span></div>
<table border="1" cellspacing="0" style="border-collapse: collapse; border: none; font-size: 16px; margin-left: -9pt; width: 477pt;"><tbody>
<tr style="height: 28.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 141.9000pt;" valign="top" width="236"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">id</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 161.8500pt;" valign="top" width="269"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">score</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 173.2500pt;" valign="top" width="288"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">bonus</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 28.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 141.9000pt;" valign="top" width="236"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">e01</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 161.8500pt;" valign="top" width="269"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">9</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 173.2500pt;" valign="top" width="288"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">800</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 28.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 141.9000pt;" valign="top" width="236"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">e02</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 161.8500pt;" valign="top" width="269"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">21</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 173.2500pt;" valign="top" width="288"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2300</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 28.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 141.9000pt;" valign="top" width="236"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">e03</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 161.8500pt;" valign="top" width="269"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">25</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 173.2500pt;" valign="top" width="288"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2800</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 28.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 141.9000pt;" valign="top" width="236"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">e04</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 161.8500pt;" valign="top" width="269"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">33</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 173.2500pt;" valign="top" width="288"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">4100</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 28.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 141.9000pt;" valign="top" width="236"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">e05</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 161.8500pt;" valign="top" width="269"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">46</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 173.2500pt;" valign="top" width="288"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">5800</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 28.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 141.9000pt;" valign="top" width="236"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">e06</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 161.8500pt;" valign="top" width="269"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">52</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 173.2500pt;" valign="top" width="288"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;"><span style="font-size: small;">6099</span></span><span style="color: #333333; font-size: 9.5pt; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
</tbody></table>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">Since the performance scores are not fixed, the number of intervals is unfixed too. Oracle and MSSQL are able to implement this by creating an auxiliary interval list and using the window functions, but they produce lengthy code. It’s even harder for databases that don’t support window functions, such as MySQL. esProc is a simpler alternative to deal with this type of non-equi-grouping cases. Below is the esProc code:</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105417.jpg" rel="attachment wp-att-2345" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;"><img alt="2016-03-09_105417" class="aligncenter size-full wp-image-2345" data-attachment-id="2345" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105417" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105417.jpg?w=387" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105417.jpg?w=300" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105417.jpg" data-orig-size="387,85" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105417/" sizes="(max-width: 387px) 100vw, 387px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105417.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105417.jpg 387w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105417.jpg?w=150 150w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105417.jpg?w=300 300w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></span></a></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">A2 generates intervals dynamically, in which <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">m</em> gets members by their sequence numbers,<em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">m(-1)</em> gets the last member and “\” gets the integer part of the quotient. A3 creates a two-dimensional table based on A2 and accumulates bonuses by querying corresponding records in A1. Here’s the result:</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105426.jpg" rel="attachment wp-att-2346" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;"><img alt="2016-03-09_105426" class="aligncenter size-full wp-image-2346" data-attachment-id="2346" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105426" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105426.jpg?w=300" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105426.jpg?w=300" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105426.jpg" data-orig-size="300,145" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105426/" sizes="(max-width: 300px) 100vw, 300px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105426.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105426.jpg 300w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105426.jpg?w=150 150w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></span></a></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<strong style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;">Complementing the source table for fixed grouping</span></strong></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">building</em> table contains records of project completion, in which <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">year</em> is the string type completion time in the format of “year the first half year\the second half year”. For the report, we need to count the number of buildings that have been completed for each type of project during every half year over a period specified by beginning and ending years. Below is the source data:</span></div>
<table border="1" cellspacing="0" style="border-collapse: collapse; border: none; font-size: 16px; margin-left: -9pt; width: 479pt;"><tbody>
<tr style="height: 27.8500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 126.3500pt;" valign="top" width="210"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">id</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 136.8000pt;" valign="top" width="228"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">type</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 215.8500pt;" valign="top" width="359"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">year</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 27.8500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 126.3500pt;" valign="top" width="210"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 136.8000pt;" valign="top" width="228"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">33</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 215.8500pt;" valign="top" width="359"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2014 last half</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 27.8500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 126.3500pt;" valign="top" width="210"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 136.8000pt;" valign="top" width="228"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">33</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 215.8500pt;" valign="top" width="359"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2014 last half</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 27.8500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 126.3500pt;" valign="top" width="210"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">3</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 136.8000pt;" valign="top" width="228"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">33</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 215.8500pt;" valign="top" width="359"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">2013 first half</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 28.7000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 126.3500pt;" valign="top" width="210"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">4</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 136.8000pt;" valign="top" width="228"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><span style="color: #333333; letter-spacing: 0pt;">34</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 215.8500pt;" valign="top" width="359"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;"><span style="font-size: small;">2013 first half</span></span><span style="color: #333333; font-size: 9.5pt; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
</tbody></table>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">The years in the source table are inconsecutive. It’s not easy for SQL to fill in the missing years and then do the left join. We can use esProc to make the job simpler:</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105436.jpg" rel="attachment wp-att-2347" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;"><img alt="2016-03-09_105436" class="aligncenter size-full wp-image-2347" data-attachment-id="2347" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105436" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105436.jpg?w=570" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105436.jpg?w=300" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105436.jpg" data-orig-size="570,106" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105436/" sizes="(max-width: 570px) 100vw, 570px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105436.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105436.jpg 570w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105436.jpg?w=150 150w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105436.jpg?w=300 300w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></span></a></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">A2 creates a new two-dimensional table. A3 creates a year list according to the beginning and ending parameters (<em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">argb</em>, <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">arge</em>). A4 groups the <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">building</em> table by type and processes each group by loop. Each loop (B4) will insert into A2 a number of records that are the same with the number of items in the year list. Here’s A2’s final result:</span></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105444.jpg" rel="attachment wp-att-2348" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;"><img alt="2016-03-09_105444" class="aligncenter size-full wp-image-2348" data-attachment-id="2348" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105444" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105444.jpg?w=299" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105444.jpg?w=299" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105444.jpg" data-orig-size="299,265" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105444/" sizes="(max-width: 299px) 100vw, 299px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105444.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105444.jpg 299w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105444.jpg?w=150 150w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></span></a></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<strong style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "georgia" , "times new roman" , serif;">Complement to the source table for fixed grouping and transposition</span></strong></div>
<div style="background: border: 0px; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;">The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">onBusiness</em> table stores the records of the employees’ business trips, in which <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Date</em>and <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">id_user</em> are the main fields. The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">user</em> table holds the user information, whose main fields are <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">id</em> and<em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> name</em>. We want to show in the report whether each employee has a business trip plan for each week in order, with a special requirement that each employee has a column. Below is a selection from the <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">onBusiness</em> table:</span></div>
<table border="1" cellspacing="0" style="border-collapse: collapse; border: none; margin-left: -9pt; width: 433pt;"><tbody>
<tr style="height: 25.8000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 243.2000pt;" valign="top" width="405"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">Date</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 189.8000pt;" valign="top" width="316"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">id_user</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 25.8000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 243.2000pt;" valign="top" width="405"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">2015-06-22</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 189.8000pt;" valign="top" width="316"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">2</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 25.8000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 243.2000pt;" valign="top" width="405"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">2015-06-01</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 189.8000pt;" valign="top" width="316"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 25.8000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 243.2000pt;" valign="top" width="405"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">2015-06-03</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 189.8000pt;" valign="top" width="316"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 25.8000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 243.2000pt;" valign="top" width="405"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">2015-06-19</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 189.8000pt;" valign="top" width="316"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 26.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 243.2000pt;" valign="top" width="405"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">2015-06-02</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 189.8000pt;" valign="top" width="316"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">2</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
</tbody></table>
<div class="p" style="background: margin: 0pt 0pt 14.4pt; padding: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; letter-spacing: 0pt;">Suppose the beginning date and ending date are 2015-05-31 and 2015-06-28, the desired report layout would be like this:</span><span style="letter-spacing: 0pt;"><o:p></o:p></span></span></div>
<table border="1" cellspacing="0" style="border-collapse: collapse; border: none; margin-left: -9pt; width: 432pt;"><tbody>
<tr style="height: 24.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 113.6500pt;" valign="top" width="189"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">week</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 115.6000pt;" valign="top" width="192"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">user1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 202.7500pt;" valign="top" width="337"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">user2</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 24.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 113.6500pt;" valign="top" width="189"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">1</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 115.6000pt;" valign="top" width="192"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">yes</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 202.7500pt;" valign="top" width="337"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">yes</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 24.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 113.6500pt;" valign="top" width="189"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">2</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 115.6000pt;" valign="top" width="192"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">No</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 202.7500pt;" valign="top" width="337"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">No</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 24.3500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 113.6500pt;" valign="top" width="189"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">3</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 115.6000pt;" valign="top" width="192"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">yes</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 202.7500pt;" valign="top" width="337"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">No</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
<tr style="height: 24.9000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 113.6500pt;" valign="top" width="189"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">4</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 115.6000pt;" valign="top" width="192"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">No</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 202.7500pt;" valign="top" width="337"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="color: #333333; letter-spacing: 0pt;">yes</span><span style="color: #333333; letter-spacing: 0pt;"><o:p></o:p></span></span></div>
</td></tr>
</tbody></table>
<div class="p" style="background: margin: 0pt 0pt 14.4pt; padding: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; letter-spacing: 0pt;"><span style="font-family: "georgia" , "times new roman" , serif;">esProc code:</span></span><span style="font-family: "georgia"; font-size: 9.5pt; letter-spacing: 0pt;"><o:p></o:p></span></div>
<div class="p" style="background: margin: 0pt 0pt 14.4pt; padding: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; letter-spacing: 0pt;"><span style="font-family: "georgia" , "times new roman" , serif;"><br /></span></span></div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105520.jpg" rel="attachment wp-att-2349" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><img alt="2016-03-09_105520" class="aligncenter size-full wp-image-2349" data-attachment-id="2349" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105520" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105520.jpg?w=546" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105520.jpg?w=300" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105520.jpg" data-orig-size="546,134" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105520/" sizes="(max-width: 546px) 100vw, 546px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105520.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105520.jpg 546w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105520.jpg?w=150 150w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105520.jpg?w=300 300w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></a></div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
First query the desired data using a simple join statement. Next create a two-dimensional table A3 by the intervals, where each week has a row (automatically filling in missing values when dates are interrupted) and each employee has a column. The initial values are “No”. Then loop through A2’s groups to modify corresponding values in A3 to “Yes”.</div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<strong style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Inter-group calculation by months</strong></div>
<div class="p" style="background: margin: 0pt 0pt 14.4pt; padding: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; letter-spacing: 0pt;"></span></div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">work</em> table stores information for a job. In the table, <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">People</em> field holds names of workers, <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Date</em> field has the entry dates and <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Deleted</em> field holds the quitting dates. We need to summarize from March to July how many people are on the job each month in the report. Below is the source data:</div>
<table border="1" cellspacing="0" style="border-collapse: collapse; border: none; margin-left: -9.0000pt; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-insideh: 0.5000pt solid rgb(231,231,231); mso-border-insidev: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); mso-padding-alt: 0.0000pt 0.0000pt 0.0000pt 0.0000pt; width: 461.0000pt;"><tbody>
<tr style="height: 27.2500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 121.1500pt;" valign="top" width="201"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">People</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 148.4000pt;" valign="top" width="247"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Date</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 191.4500pt;" valign="top" width="319"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Deleted</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.2500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 121.1500pt;" valign="top" width="201"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Amanda</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 148.4000pt;" valign="top" width="247"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-03-01</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 191.4500pt;" valign="top" width="319"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Null</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.2500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 121.1500pt;" valign="top" width="201"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Ray</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 148.4000pt;" valign="top" width="247"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-03-01</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 191.4500pt;" valign="top" width="319"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Null</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.2500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 121.1500pt;" valign="top" width="201"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Moe</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 148.4000pt;" valign="top" width="247"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-04-01</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 191.4500pt;" valign="top" width="319"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Null</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.2500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 121.1500pt;" valign="top" width="201"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Yan</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 148.4000pt;" valign="top" width="247"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-05-01</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 191.4500pt;" valign="top" width="319"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Null</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.2500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 121.1500pt;" valign="top" width="201"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Bee</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 148.4000pt;" valign="top" width="247"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-05-05</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 191.4500pt;" valign="top" width="319"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-12</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.2500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 121.1500pt;" valign="top" width="201"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Lee</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 148.4000pt;" valign="top" width="247"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-06</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 191.4500pt;" valign="top" width="319"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Null</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.8500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 121.1500pt;" valign="top" width="201"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Jason</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 148.4000pt;" valign="top" width="247"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-05-01</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 191.4500pt;" valign="top" width="319"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-07-03</span><span style="color: #333333; font-family: "georgia"; font-size: 9.5pt; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
</tbody></table>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
The problem here is that the months in the source table may be discontinuous, yet we want a consecutive result. So we need to first generate the consecutive months and then perform the alignment grouping on the source table according to the consecutive months. A worker who quits the job will still be included in the on-the-job list of the current month, but will be excluded from that of the next month. To obtain the right number of the workers who are on the job in each month, we need to perform the inter-column calculation and inter-group accumulation.</div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
esProc code:</div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105604.jpg" rel="attachment wp-att-2350" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><img alt="2016-03-09_105604" class="aligncenter size-full wp-image-2350" data-attachment-id="2350" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105604" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105604.jpg?w=500" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105604.jpg?w=300" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105604.jpg" data-orig-size="500,91" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105604/" sizes="(max-width: 500px) 100vw, 500px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105604.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105604.jpg 500w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105604.jpg?w=150 150w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105604.jpg?w=300 300w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></a></div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">to</em> function generates a consecutive sequence. The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">new</em> function creates a two-dimensional table based on a sequence (or another two-dimensional table). ~ represents the current member in the original sequence. Here’s the final result:</div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105614.jpg" rel="attachment wp-att-2351" style="background: transparent; border: 0px; color: #ff4b33; margin: 0px; padding: 0px; vertical-align: baseline;"><img alt="2016-03-09_105614" class="aligncenter size-full wp-image-2351" data-attachment-id="2351" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105614" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105614.jpg?w=203" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105614.jpg?w=203" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105614.jpg" data-orig-size="203,124" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105614/" sizes="(max-width: 203px) 100vw, 203px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105614.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105614.jpg 203w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105614.jpg?w=150 150w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></a></div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<strong style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Dynamic locating of an interval</strong></div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Transaction</em> table records the time points of each transaction for each user. The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Discount</em> table holds the discount information after certain time points. There are multiple discount records, forming dynamic time intervals. Now we need to calculate the discount of each transaction for each user for reporting.</div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
Below is a selection of the <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Transaction</em> table:</div>
<table border="1" cellspacing="0" style="border-collapse: collapse; border: none; margin-left: -9.0000pt; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-insideh: 0.5000pt solid rgb(231,231,231); mso-border-insidev: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); mso-padding-alt: 0.0000pt 0.0000pt 0.0000pt 0.0000pt; width: 431.0000pt;"><tbody>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">TransID</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Tuser</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Date</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t1</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Andrew</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 13:13:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t2</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Andrew</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 13:15:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t3</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Andrew</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 13:17:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t4</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Andrew</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 14:15:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t5</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Andrew</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 14:18:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t6</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Andrew</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 14:25:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t7</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Andrew</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 14:35:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t8</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Andrew</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 14:55:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t9</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">tylor</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 13:13:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 27.6500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t10</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">tylor</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 14:15:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 28.8500pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 105.1500pt;" valign="top" width="175"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">t11</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.6500pt;" valign="top" width="169"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">tylor</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 224.2000pt;" valign="top" width="373"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 14:55:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
</tbody></table>
<div class="p" style="background: rgb(255,255,255); margin-bottom: 14.4000pt; margin-left: 0.0000pt; margin-right: 0.0000pt; margin-top: 0.0000pt; mso-pagination: widow-orphan; padding: 0pt 0pt 0pt 0pt; text-indent: 0.0000pt; vertical-align: baseline;">
<span style="font-family: "georgia"; letter-spacing: 0pt;">Below is a selection of the </span><i><span class="15" style="font-family: "georgia"; letter-spacing: 0pt;">Discount </span></i><span style="font-family: "georgia"; letter-spacing: 0pt;">table:</span><span style="font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
<table border="1" cellspacing="0" style="border-collapse: collapse; border: none; margin-left: -9.0000pt; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-insideh: 0.5000pt solid rgb(231,231,231); mso-border-insidev: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); mso-padding-alt: 0.0000pt 0.0000pt 0.0000pt 0.0000pt; width: 431.0000pt;"><tbody>
<tr style="height: 24.8000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 117.8500pt;" valign="top" width="196"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">DiscountID</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 211.8000pt;" valign="top" width="353"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Date</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: 1.0000pt solid rgb(231,231,231); mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.3500pt;" valign="top" width="168"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">Discount</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 24.8000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 117.8500pt;" valign="top" width="196"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">d1</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 211.8000pt;" valign="top" width="353"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 13:00:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.3500pt;" valign="top" width="168"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">30</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 24.8000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 117.8500pt;" valign="top" width="196"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">d2</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 211.8000pt;" valign="top" width="353"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 14:00:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.3500pt;" valign="top" width="168"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">25</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
<tr style="height: 25.3000pt;"><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: 1.0000pt solid rgb(231,231,231); border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: 0.5000pt solid rgb(231,231,231); mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 117.8500pt;" valign="top" width="196"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">d3</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 211.8000pt;" valign="top" width="353"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">2015-06-16 14:30:00</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td><td style="background: rgb(255,255,255); border-bottom: 1.0000pt solid rgb(231,231,231); border-left: none; border-right: 1.0000pt solid rgb(231,231,231); border-top: none; mso-border-bottom-alt: 0.5000pt solid rgb(231,231,231); mso-border-left-alt: none; mso-border-right-alt: 0.5000pt solid rgb(231,231,231); mso-border-top-alt: 0.5000pt solid rgb(231,231,231); padding: 3.6000pt 14.4000pt 3.6000pt 14.4000pt; width: 101.3500pt;" valign="top" width="168"><div class="MsoNormal" style="margin: 0pt; text-indent: 0pt; vertical-align: baseline;">
<span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;">20</span><span style="color: #333333; font-family: "georgia"; letter-spacing: 0pt;"><o:p></o:p></span></div>
</td></tr>
</tbody></table>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
In SQL, we need to first generate the time intervals through inter-row calculation and then perform the join, which is difficult to implement. Whereas in esProc, we can perform the equi-grouping on <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Transaction</em> according to <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Discount</em>, meaning the code is simpler:</div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105715.jpg" rel="attachment wp-att-2352" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><img alt="2016-03-09_105715" class="aligncenter size-full wp-image-2352" data-attachment-id="2352" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105715" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105715.jpg?w=431" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105715.jpg?w=300" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105715.jpg" data-orig-size="431,115" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105715/" sizes="(max-width: 431px) 100vw, 431px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105715.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105715.jpg 431w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105715.jpg?w=150 150w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105715.jpg?w=300 300w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></a></div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
The <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">pseq</em> function calculates the interval number to which a record belongs, and A2(…) gets records by their sequence numbers. Here’s the result:</div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105725.jpg" rel="attachment wp-att-2353" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><img alt="2016-03-09_105725" class="aligncenter size-full wp-image-2353" data-attachment-id="2353" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105725" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105725.jpg?w=264" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105725.jpg?w=264" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105725.jpg" data-orig-size="264,189" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105725/" sizes="(max-width: 264px) 100vw, 264px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105725.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105725.jpg 264w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105725.jpg?w=150 150w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></a></div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
In this example all users share the same discount. If each user has its own discount (there is a <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">DUser</em> field in the <em style="background: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Discount</em> table), the code should be like this:</div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105756.jpg" rel="attachment wp-att-2354" style="background: transparent; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;"><img alt="2016-03-09_105756" class="aligncenter size-full wp-image-2354" data-attachment-id="2354" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105756" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105756.jpg?w=505" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105756.jpg?w=300" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105756.jpg" data-orig-size="505,114" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105756/" sizes="(max-width: 505px) 100vw, 505px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105756.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105756.jpg 505w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105756.jpg?w=150 150w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105756.jpg?w=300 300w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></a></div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
Here’s the result:</div>
<div style="background: border: 0px; font-family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
<a href="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105805.jpg" rel="attachment wp-att-2355" style="background: transparent; border: 0px; color: #ff4b33; margin: 0px; padding: 0px; vertical-align: baseline;"><img alt="2016-03-09_105805" class="aligncenter size-full wp-image-2355" data-attachment-id="2355" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2016-03-09_105805" data-large-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105805.jpg?w=346" data-medium-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105805.jpg?w=300" data-orig-file="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105805.jpg" data-orig-size="346,253" data-permalink="https://datathinker.wordpress.com/2016/03/09/how-to-use-esproc-to-assist-reporting-tools/2016-03-09_105805/" sizes="(max-width: 346px) 100vw, 346px" src="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105805.jpg?w=640" srcset="https://datathinker.files.wordpress.com/2016/03/2016-03-09_105805.jpg 346w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105805.jpg?w=150 150w, https://datathinker.files.wordpress.com/2016/03/2016-03-09_105805.jpg?w=300 300w" style="background: transparent; border: none; clear: both; display: block; height: auto; margin: 0px auto 12px; max-width: 100%; padding: 0px; vertical-align: baseline;" /></a></div>
<div class="MsoNormal">
<br /></div>
</div>
<div style="background: border: 0px; color: #333333; family: Georgia, "Bitstream Charter", serif; font-size: 16px; margin-bottom: 24px; padding: 0px; vertical-align: baseline;">
</div>
Huocxhttp://www.blogger.com/profile/02976232401731847120noreply@blogger.com0tag:blogger.com,1999:blog-5773662941385236123.post-71182450175647732832019-05-09T20:57:00.000-07:002019-05-09T20:57:16.572-07:00Simplifying MongoDB Data Association<div class="content-reset article-content" data-author="pjf" data-link="http://c.raqsoft.com/article/1545702966257">
With $lookup operator, MongoDB supports the most basic data association between multiple tables. When data association tasks are complicated, the Mongo shell script becomes complicated. With SPL’s discreteness and ease of use (SPL is the abbreviation of Structured Process Language developed by Raqsoft), esProc can help simplify data association in MongoDB. There are more related articles in Raqsoft Community (<a href="http://c.raqsoft.com/" rel="nofollow">http://c.raqsoft.com/</a>).<br />
MongoDB is a document-oriented NoSQL database operated on a distributed file system. It stores documents in BSON format, which descripts entity attributes in a more natural and intuitive manner. Since Version 3.2, MongoDB has improved its query capability by supporting data association via $lookup. The real-world business scenarios, however, are complicated and the computing problems are knotty. This results in tortuous scripting process.<br />
<br />
In this article, we’ll explain how to simplify association of MongoDB data in SPL.<br />
1. Association with embedded structures (1)<br />
2. Association with embedded structures (2)<br />
3. Association with embedded structures (3)<br />
4. Association with selected fields<br />
5. Multi-table association<br />
6. Associated query by array values<br />
7. Calling esProc <em>dfx</em> script in Java<br />
<br />
<b><span style="font-size: large;">1. Association with embedded structures (1)</span></b><br />
This involves two associated tables. One of table A’s field is associated with the sub-documents in table B, and the to-be-returned data is contained in the sub-documents. For example, the <em>childs</em> field of <em>childsgroup</em> table contains embedded arrays, in which the <em>name</em> item and <em>mobile</em> item need to be returned.<br />
<br />
<strong>Test data:</strong><br />
<em>history:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id </th>
<th style="vertical-align: top;" width="30%">id </th>
<th style="vertical-align: top;" width="30%">History </th>
<th style="vertical-align: top;" width="30%">child_id </th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">001 </td>
<td style="vertical-align: top;">today worked </td>
<td style="vertical-align: top;">ch001 </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">002 </td>
<td style="vertical-align: top;">Working </td>
<td style="vertical-align: top;">ch004 </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">003 </td>
<td style="vertical-align: top;">now working </td>
<td style="vertical-align: top;">ch009 </td>
</tr>
</tbody>
</table>
<em>childsgroup:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id </th>
<th style="vertical-align: top;" width="20%">groupid </th>
<th style="vertical-align: top;" width="20%">name </th>
<th style="vertical-align: top;" width="50%">childs </th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">g001 </td>
<td style="vertical-align: top;">group1 </td>
<td style="vertical-align: top;">{"id":"ch001","info":{"name":"a",mobile:1111}},<br />
{"id":"ch002","info":{"name":"b",mobile:2222}} </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">g002 </td>
<td style="vertical-align: top;">group1 </td>
<td style="vertical-align: top;">{"id":"ch004","info":{"name":"c",mobile:3333}},<br />
{"id":"ch009","info":{"name":"d",mobile:4444}} </td>
</tr>
</tbody>
</table>
<br />
The <em>child_id</em> field in <em>history</em> table associates with <em>childs.id</em> in <em>childsgroup</em> table. Below is the desired joining result:<br />
{<br />
“_id” : ObjectId(“5bab2ae8ab2f1bdb4f434bc3”),<br />
“id” : “001”,<br />
“history” : “today worked”,<br />
“child_id” : “ch001”,<br />
“childInfo” :<br />
{<br />
“name” : “a”,<br />
“mobile” : 1111<br />
}<br />
………………<br />
}<br />
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.history.aggregate([<br />
{$lookup: {<br />
from: "childsgroup",<br />
let: {child_id: "$child_id"},<br />
pipeline: [<br />
{$match: { $expr: { $in: [ "$$child_id", "$childs.id"] } } },<br />
{$unwind: "$childs"},<br />
{$match: { $expr: { $eq: [ "$childs.id", "$$child_id"] } } },<br />
{$replaceRoot: { newRoot: "$childs.info"} }<br />
],<br />
as: "childInfo"<br />
}},<br />
{"$unwind": "$childInfo"}<br />
])</td>
</tr>
</tbody>
</table>
<br />The script uses five operators, including lookup, pipeline, match, unwind and replaceRoot, to handle the computation. It’s complicated and difficult to write.<br />
<br />
SPL script (<em>childsgroup.dfx</em>)<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"history.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"childsgroup.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A3.conj(childs) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.join(child_id,A4:id,info) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">6 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />Associated query result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id</th>
<th style="vertical-align: top;" width="18%">id</th>
<th style="vertical-align: top;" width="18%">history</th>
<th style="vertical-align: top;" width="18%">child_id</th>
<th style="vertical-align: top;" width="18%">info</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">001 </td>
<td style="vertical-align: top;">today worked </td>
<td style="vertical-align: top;">ch001 </td>
<td style="vertical-align: top;">[a,1111] </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">002 </td>
<td style="vertical-align: top;">working </td>
<td style="vertical-align: top;">ch004 </td>
<td style="vertical-align: top;">[c,3333] </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">003 </td>
<td style="vertical-align: top;">now working </td>
<td style="vertical-align: top;">ch009 </td>
<td style="vertical-align: top;">[d,4444] </td>
</tr>
</tbody>
</table>
<br />SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read in data from <em>history</em> table.<br />
A3: Read in data from <em>childsgroup</em> table.<br />
A4: Concatenate the array values in <em>childsgroup</em> table’s <em>childs</em> field into a table sequence.<br />
A5: Perform an associated query between <em>history</em> table an A4’s <em>childs</em> table via the associated fields <em>child_id</em> and <em>id</em> and append an <em>info</em> field to generate a new table sequence.<br />
A6: Close the database connection.<br />
The SPL script is simple, clear and efficient.<br />
<br />
<b><span style="font-size: large;">2. Association with embedded structures (2)</span></b><br />
There are two associated tables. Table A is associated with table B’s embedded documents. The task is to combine table A’s data under the embedded documents. For example, <em>txtPost</em> table’s <em>Comment</em> field contains array values; combine <em>comment_content</em> field of <em>txtComment</em> table under the arrays.<br />
<br />
<em>txtComment:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_ID</th>
<th style="vertical-align: top;" width="45%">comment_no</th>
<th style="vertical-align: top;" width="45%">comment_content</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">143 </td>
<td style="vertical-align: top;">test test </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">140 </td>
<td style="vertical-align: top;">math </td>
</tr>
</tbody>
</table>
<em>txtPost:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_ID</th>
<th style="vertical-align: top;" width="20%">post_no</th>
<th style="vertical-align: top;" width="70%">Comment</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">48 </td>
<td style="vertical-align: top;">[{"comment_no" : 143, "comment_group" : 1} ] </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">47 </td>
<td style="vertical-align: top;">[{"comment_no" : 140, "comment_group" : 2},<br />
{"comment_no" : 143, "comment_group" : 3} ] </td>
</tr>
</tbody>
</table>
<br />Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_ID</th>
<th style="vertical-align: top;" width="15%">post_no</th>
<th style="vertical-align: top;" width="75%">Comment</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">48 </td>
<td style="vertical-align: top;">[{"comment_no" : 143, "comment_group" : 1,"comment_content" : "test test"} ] </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">47 </td>
<td style="vertical-align: top;">[{"comment_no" : 140, "comment_group" : 2,"comment_content" : "math"},<br />
{"comment_no" : 143, "comment_group" : 3,"comment_content" : "test test"} ] </td>
</tr>
</tbody>
</table>
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.getCollection("txtPost").aggregate([ <br />
{"$unwind": "$comment"},<br />
{ "$lookup": {<br />
"from": "txtComment",<br />
"localField": "comment.comment_no",<br />
"foreignField": "comment_no",<br />
"as": "comment.comment_content"<br />
}},<br />
{"$unwind": "$comment.comment_content"},<br />
{"$addFields": { "comment.comment_content":"$comment.comment_content.comment_content"}},<br />
{ "$group": {<br />
"_id": "$_id",<br />
'post_no':{"$first": "$post_no"},<br />
"comment": {"$push": "$comment"}<br />
}},<br />
<br />
]).pretty()</td>
</tr>
</tbody>
</table>
Split <em>txtPost</em> records according to members of <em>Comment</em> arrays into more records, perform an associated query between them with records of <em>txtComment</em>, store the result as an array and split the array into records, move <em>comment_content</em> values under <em>Comment</em> field, and group and concatenate the records.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"txtPost.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"txtComment.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.conj(comment.derive(A2.post_no:pno)) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A4.join(comment_no,A3:comment_no,comment_content:Content) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">6 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A5.group(pno;~:comment) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">7 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />Associated query result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">pno </th>
<th style="vertical-align: top;" width="80%">Comment </th>
</tr>
<tr>
<td style="vertical-align: top;">47 </td>
<td style="vertical-align: top;">[[140, 2,47, …],[143, 3,47, …] ] </td>
</tr>
<tr>
<td style="vertical-align: top;">48 </td>
<td style="vertical-align: top;">[[143, 1,48, …]] </td>
</tr>
</tbody>
</table>
<br />SPL script explanation:<br />
A1:Connect to MongoDB database.<br />
A2:Read data from <em>txtPost</em> table.<br />
A3:Read data from <em>txComment</em> table.<br />
A4:Create a table sequence with A2’s <em>Comment</em> field and <em>post_no</em> field, which is renamed <em>pno</em>.<br />
A5:Associate A4’s table sequence with A3’s table sequence via <em>comment_no</em> and append <em>comment_content</em> field, which is renamed <em>Content</em>.<br />
A6:Group records by <em>pno</em> and return the current table; ~ represents the current record.<br />
A7:Close the database connection.<br />
Both scripts transform the embedded data into data stored in columns and rows, perform association, and then group the associated records. But SPL script is clearer and more concise.<br />
<br />
<b><span style="font-size: large;">3. Association with embedded structures (3)</span></b><br />
This involves two associated tables. Table A is associated with the sub-documents in table B, and the to-be-returned information is contained in the sub-records. For example, <em>product</em> field in <em>collection2</em> contains array values and the association result needs to include fields in <em>isCompleted</em> array in <em>collection2</em>.<br />
<br />
<strong>Test data:</strong><br />
collection1:<br />
<pre><textarea style="height: 175px; margin: 0px; width: 308px;">{
_id: '5bc2e44a106342152cd83e97',
description:
{
status: 'Good',
machine: 'X'
},
order: 'A',
lot: '1'
};
</textarea></pre>
<pre><span style="font-family: Verdana, sans-serif;">collection2:</span></pre>
<pre><textarea style="height: 200px; margin: 0px; width: 307px;">{
_id: '5bc2e44a106342152cd83e80',
isCompleted: false,
serialNo: '1',
batchNo: '2',
<!-- note the subdocuments here-->
product: [
{ order: 'A', lot: '1' },
{ order: 'A', lot: '2' }
]
}
</textarea></pre>
<pre><span style="font-family: Verdana, sans-serif;">Desired result:</span></pre>
<pre><textarea style="height: 221px; margin: 0px; width: 305px;">{
_id: 5bc2e44a106342152cd83e97,
description:
{
status: 'Good',
machine: 'X',
},
order: 'A',
lot: '1' ,
isCompleted: false,
serialNo: '1',
batchNo: '2'
}
</textarea><code class="hljs bash" style="max-height: 714px;">
</code></pre>
<pre>
</pre>
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.collection1.aggregate([{ <br />
$lookup: {<br />
from: "collection2",<br />
let: {order: "$order", lot: "$lot"},<br />
pipeline: [{<br />
$match: { <br />
$expr:{$in: [ { order: "$$order", lot: "$$lot"}, "$product"] }<br />
} <br />
}], <br />
as: "isCompleted" <br />
} <br />
}, {<br />
$addFields: { <br />
"isCompleted": {$arrayElemAt: [ "$isCompleted", 0] }<br />
} <br />
}, {<br />
$addFields: { // add the required fields to the top level structure <br />
"isCompleted": "$isCompleted.isCompleted",<br />
"serialNo": "$isCompleted.serialNo",<br />
"batchNo": "$isCompleted.batchNo" <br />
} <br />
}])</td>
</tr>
</tbody>
</table>
$lookup performs an associated query between the two tables. The first $addFields gets the first field from <em>isCompleted</em> array, and the second $addFields adds the other required fields.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"collection1.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"collection2.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A3.conj(A2.select(order:A3.product.order,lot:A3.product.lot).derive(A3.serialNo:sno,A3.batchNo:bno)) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1:Connect to MongoDB database.<br />
A2:Read data from <em>collection1</em> table.<br />
A3:Read data from <em>collection2</em> table.<br />
A4:Query A2’s table according to <em>order</em> field and <em>lot</em> field, add A3’s <em>serialNo</em> field and <em>batchNo</em> field, and return the associated table sequence.<br />
A5:Close the database connection.<br />
Both scripts get the desired result. SPL script is clear in selecting required data from the embedded documents and concatenating them into a new table sequence.<br />
<br />
<b><span style="font-size: large;">4. Association with selected fields</span></b><br />
Create a new table through association and with selected fields.<br />
<br />
<em>collection1:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="30%">user1</th>
<th style="vertical-align: top;" width="30%">user2</th>
<th style="vertical-align: top;" width="40%">income</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">0.56 </td>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">0.26 </td>
</tr>
</tbody>
</table>
<em>collection2:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="30%">user1</th>
<th style="vertical-align: top;" width="30%">user2</th>
<th style="vertical-align: top;" width="40%">output</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">0.3 </td>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">0.4 </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">0.5 </td>
</tr>
</tbody>
</table>
<br />Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="25%">user1</th>
<th style="vertical-align: top;" width="25%">user2</th>
<th style="vertical-align: top;" width="25%">income</th>
<th style="vertical-align: top;" width="25%">output</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">0.56 </td>
<td style="vertical-align: top;">0.3 </td>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">0.26 </td>
<td style="vertical-align: top;">0.4 </td>
</tr>
</tbody>
</table>
<br />MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.c1.aggregate([<br />
{ "$lookup": { <br />
"from": "c2", <br />
"localField": "user1", <br />
"foreignField": "user1", <br />
"as": "collection2_doc"<br />
}}, <br />
{"$unwind": "$collection2_doc"},<br />
{ "$redact": { <br />
"$cond": [<br />
{"$eq": [ "$user2", "$collection2_doc.user2"] }, <br />
"$$KEEP", <br />
"$$PRUNE"<br />
]<br />
}}, <br />
{ "$project": { <br />
"user1": 1, <br />
"user2": 1, <br />
"income": "$income", <br />
"output": "$collection2_doc. output"<br />
}}<br />
]).pretty()</td>
</tr>
</tbody>
</table>
$lookup performs an associated query.$redact traverses records to perform conditional handling. $project selects the desired fields.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"c1.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"c2.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.join(user1:user2,A3:user1:user2,output) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read data from <em>collection1</em> table.<br />
A3: Read data from <em>collection2</em> table.<br />
A4: Join the two tables by <em>user1</em> and <em>user2</em>, append A3’s <em>output</em> field and return a new table sequence.<br />
A5: Close the database connection.<br />
Both MongDB script and SPL script achieve the computing goal. The latter combines some of fields in two tables via a join into a new table, which is similar to relational database computation.<br />
<br />
<b><span style="font-size: large;">5. Multi-table association</span></b><br />
This is the association between more than two tables to get a merged table.<br />
<em>Doc1:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id </th>
<th style="vertical-align: top;" width="40%">firstName </th>
<th style="vertical-align: top;" width="40%">lastName </th>
</tr>
<tr>
<td style="vertical-align: top;">U001 </td>
<td style="vertical-align: top;">shubham </td>
<td style="vertical-align: top;">verma </td>
</tr>
</tbody>
</table>
<em>Doc2:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id </th>
<th style="vertical-align: top;" width="20%">userId</th>
<th style="vertical-align: top;" width="30%">address</th>
<th style="vertical-align: top;" width="30%">mob</th>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">U001 </td>
<td style="vertical-align: top;">Gurgaon </td>
<td style="vertical-align: top;">9876543200 </td>
</tr>
</tbody>
</table>
<em>Doc3:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id </th>
<th style="vertical-align: top;" width="20%">userId</th>
<th style="vertical-align: top;" width="30%">fbURLs</th>
<th style="vertical-align: top;" width="30%">twitterURLs</th>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">U001 </td>
<td style="vertical-align: top;">http://www.facebook.com </td>
<td style="vertical-align: top;">http://www.twitter.com </td>
</tr>
</tbody>
</table>
<br />
Merged result:<br />
<pre><textarea style="height: 232px; margin: 0px; width: 358px;">{
"_id" : ObjectId("5901a4c63541b7d5d3293766"),
"firstName" : "shubham",
"lastName" : "verma",
"address" : {
"address" : "Gurgaon"
},
"social" : {
"fbURLs" : "http://www.facebook.com",
"twitterURLs" : "http://www.twitter.com"
}
}
</textarea><code class="hljs json" style="max-height: 714px;">
</code></pre>
<pre>
</pre>
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.doc1.aggregate([<br />
{$match: { _id: ObjectId("5901a4c63541b7d5d3293766") } },<br />
{<br />
$lookup:<br />
{<br />
from: "doc2",<br />
localField: "_id",<br />
foreignField: "userId",<br />
as: "address"<br />
}<br />
},<br />
{<br />
$unwind: "$address"<br />
},<br />
{<br />
$project: {<br />
"address._id": 0,<br />
"address.userId": 0,<br />
"address.mob": 0<br />
}<br />
},<br />
{<br />
$lookup:<br />
{<br />
from: "doc3",<br />
localField: "_id",<br />
foreignField: "userId",<br />
as: "social"<br />
}<br />
},<br />
{<br />
$unwind: "$social"<br />
},<br />
<br />
{ <br />
$project: { <br />
"social._id": 0, <br />
"social.userId": 0 <br />
}<br />
}<br />
]).pretty();</td>
</tr>
</tbody>
</table>
There can be different MongoDB scripts to do this and various merged results in MongoDB thanks to the database’s unique data structure.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"doc1.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"doc2.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"doc3.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.join(_id,A3:userId,address,mob) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">6 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A5.join(_id,A4:userId,fbURLs,twitterURLs) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">7 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />This SPL script is similar to that in the previous example, with only one more joined table. Every join adds a new field to form a merged table.<br />
Obviously, the SPL script is concise and coherent.<br />
<br />
<span style="font-size: large;"><b>6. Associated query by array values</b></span><br />
Get records from a table according to the array field in its associated table and generate a new table with certain fields.<br />
<br />
<strong>Test data:</strong><br />
<em>users:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id</th>
<th style="vertical-align: top;" width="30%">Name</th>
<th style="vertical-align: top;" width="50%">workouts</th>
</tr>
<tr>
<td style="vertical-align: top;">1000 </td>
<td style="vertical-align: top;">xxx </td>
<td style="vertical-align: top;">[2,4,6] </td>
</tr>
<tr>
<td style="vertical-align: top;">1002 </td>
<td style="vertical-align: top;">yyy </td>
<td style="vertical-align: top;">[1,3,5] </td>
</tr>
</tbody>
</table>
<em>workouts:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id</th>
<th style="vertical-align: top;" width="30%">Date</th>
<th style="vertical-align: top;" width="50%">Book</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1/1/2001 </td>
<td style="vertical-align: top;">Othello </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">2/2/2001 </td>
<td style="vertical-align: top;">A Midsummer Night's Dream </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">3/3/2001 </td>
<td style="vertical-align: top;">The Old Man and the Sea </td>
</tr>
<tr>
<td style="vertical-align: top;">4 </td>
<td style="vertical-align: top;">4/4/2001 </td>
<td style="vertical-align: top;">GULLIVER’S TRAVELS </td>
</tr>
<tr>
<td style="vertical-align: top;">5 </td>
<td style="vertical-align: top;">5/5/2001 </td>
<td style="vertical-align: top;">Pickwick Papers </td>
</tr>
<tr>
<td style="vertical-align: top;">6 </td>
<td style="vertical-align: top;">6/6/2001 </td>
<td style="vertical-align: top;">The Red and the Black </td>
</tr>
</tbody>
</table>
<br />Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="15%">Name</th>
<th style="vertical-align: top;" width="15%">_id</th>
<th style="vertical-align: top;" width="20%">Date</th>
<th style="vertical-align: top;" width="50%">Book</th>
</tr>
<tr>
<td style="vertical-align: top;">xxx </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">2/2/2001 </td>
<td style="vertical-align: top;">A Midsummer Night's Dream </td>
</tr>
<tr>
<td style="vertical-align: top;">xxx </td>
<td style="vertical-align: top;">4 </td>
<td style="vertical-align: top;">4/4/2001 </td>
<td style="vertical-align: top;">GULLIVER’S TRAVELS </td>
</tr>
<tr>
<td style="vertical-align: top;">xxx </td>
<td style="vertical-align: top;">6 </td>
<td style="vertical-align: top;">6/6/2001 </td>
<td style="vertical-align: top;">The Red and the Black </td>
</tr>
<tr>
<td style="vertical-align: top;">yyy </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1/1/2001 </td>
<td style="vertical-align: top;">Othello </td>
</tr>
<tr>
<td style="vertical-align: top;">yyy </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">3/3/2001 </td>
<td style="vertical-align: top;">The Old Man and the Sea </td>
</tr>
<tr>
<td style="vertical-align: top;">yyy </td>
<td style="vertical-align: top;">5 </td>
<td style="vertical-align: top;">5/5/2001 </td>
<td style="vertical-align: top;">Pickwick Papers </td>
</tr>
</tbody>
</table>
<br />MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.users.aggregate([<br />
{ "$lookup": {<br />
"from" : "workouts", <br />
"localField" : "workouts", <br />
"foreignField" : "_id", <br />
"as" : "workoutDocumentsArray"<br />
}},<br />
{$project: { _id:0,workouts:0} } ,<br />
{"$unwind": "$workoutDocumentsArray"},<br />
<br />
{"$replaceRoot": { "newRoot": { $mergeObjects: [ "$$ROOT", "$workoutDocumentsArray"] } } }, <br />
{$project: { workoutDocumentsArray: 0} } <br />
]).pretty()</td>
</tr>
</tbody>
</table>
Put the result of associated query between <em>users</em> and <em>workouts</em> into an array, split the array and move the embedded document to the top level, and remove the unwanted fields.<br />
<br />
SPL script (<em>users.dfx</em>):<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"users.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"workouts.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.conj(A3.select(A2.workouts^~.array(_id)!=[]).derive(A2.name)) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read data from <em>users</em> table.<br />
A3: Read data from <em>workouts</em> table.<br />
A4: Get records from <em>workouts</em> table where <em>_id</em> field is included in <em>workouts</em> field of A2’s table sequence, add <em>name</em> field to the records, and return the concatenated table sequence.<br />
A5: Close the database connection.<br />
The operation is considered normal only if the matching result isn’t null. So <em>_id</em> field is converted into a sequence to make the comparison convenient in A4.<br />
The SPL script is more integration-friendly, more flexible and much simpler.<br />
<br />
<span style="font-weight: normal;"><span style="font-size: large;">7. Calling esProc <em>dfx</em> script in Java</span></span><br />
The result of executing an SPL script can be easily integrated by a Java application. esProc provides JDBC driver to be accessed withJava stored procedure. That is the same as calling a SQL stored procedure in Java. (For esProc JDBC deployment, refer to <em>1.9 esProc JDBC</em> in esProc <em>Tutorial</em>)<br />
<br />
Below is the process of calling an SPL script from Java:<br />
<pre><textarea style="height: 314px; margin: 0px; width: 643px;"> public void testUsers(){
Connection con = null;
com.esproc.jdbc.InternalCStatement st;
try{
//Establish database connection
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
// Call the stored procedure, in which user is the dfx file’s name
st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call users ()");
// Execute the stored procedure
st.execute();
//Get result set
ResultSet rs = st.getResultSet();
......
catch(Exception e){
System.out.println(e);
}
</textarea><code class="language-java hljs" style="max-height: 714px;">
</code></pre>
<pre>
</pre>
This is a standard JDBC invocation, which is easy to embed an SPL script into a Java application. esProc also supports the ODBC driver, which makes it easy to be integrated with languages that use ODBC.<br />
<br />
Compared with relational databases, MongoDB stores data in a more complicated, more flexible way, has powerful and adaptable query syntax, and provides various functions and rich cooperative possibilities between them. It’s not easy to be proficient in MongoDB. esProc, however, features discreteness and ease of use to become the NoSQL database’s right-hand and can help it play to its full potential.</div>
Huocxhttp://www.blogger.com/profile/02976232401731847120noreply@blogger.com0tag:blogger.com,1999:blog-5773662941385236123.post-27038950495665120382019-05-09T19:50:00.000-07:002019-05-09T19:55:09.446-07:00esProc-driven MongoDB Hackers<div class="content-reset article-content" data-author="pjf" data-link="http://c.raqsoft.com/article/1545363114397">
MongoDB is a document-oriented NoSQL database operated on a distributed file system. The non-relational database is functionally rich and very similar to a relational database. It can store data in more complicated data types because it stores documents in a loose, JSON-like BSON format. Its most noticeable feature is that it has a powerful query language, whose syntax is similar to that of an object-oriented query language. The language supports most of the operations similar to those performed over a single table in a relational database. But the queries are not simple. esProc SPL language can make those queries simple enough.<br />
<br />
In this article, we’ll explain how esProc SPL makes querying MongoDB documents more convenient in the following calculations:<br />
1. A document with array values<br />
2. A document with sub-documents<br />
3. A document grouped by segment<br />
4. Union of same-structure documents<br />
5. Association with embedded structures (1)<br />
6. Association with embedded structures (2)<br />
7. Association with embedded structures (3)<br />
8. Multi-field grouping & summarization<br />
9. Association with selected fields<br />
10. Multi-table association<br />
11. Conditional search<br />
12. Associated query by array values<br />
<br />
<span style="font-size: large;"><b>1. A document with array values</b></span><br />
This involves the handling of data in embedded array values. For instance, find the average of each subject and each student’s total mark.<br />
<br />
Test data:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="border: solid rgb(21;" width="10%">_id</th>
<th idth="15%" style="vertical-align: top;">name</th>
<th idth="15%" sstyle="vertical-align: top;">sex</th>
<th ststyle="vertical-align: top;" th="60%">Score</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">Tom </td>
<td style="vertical-align: top;">F </td>
<td style="vertical-align: top;">[{"subject":"Physics", "mark":60},<br />
{"subject":"Chemical", "mark":72}] </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">Jerry </td>
<td style="vertical-align: top;">M </td>
<td style="vertical-align: top;">[{"subject":"Physics", "mark":92}, <br />
{"subject":"Math", "mark":81}] </td>
</tr>
</tbody>
</table>
<br />
Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;" width="15%">Physics </td>
<td style="vertical-align: top;" width="15%">76 </td>
<td style="vertical-align: top;" width="40%"></td>
<td style="vertical-align: top;" width="15%">Tom </td>
<td style="vertical-align: top;" width="15%">F </td>
</tr>
<tr>
<td style="vertical-align: top;">Chemical </td>
<td style="vertical-align: top;">72 </td>
<td style="vertical-align: top;"></td>
<td style="vertical-align: top;">Jerry </td>
<td style="vertical-align: top;">173 </td>
</tr>
<tr>
<td style="vertical-align: top;">Math </td>
<td style="vertical-align: top;">81 <br />
<br /></td>
<td style="vertical-align: top;"></td>
<td style="vertical-align: top;"></td>
<td style="vertical-align: top;"></td>
</tr>
</tbody>
</table>
<br />
Mongodb script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.student.aggregate( [ <br />
{$unwind : "$score"},<br />
{$group: {<br />
"_id": {"subject":"$score.subject"} , <br />
"qty":{"$avg": "$score.mark"}<br />
}<br />
}<br />
] )</td>
<td style="vertical-align: top;">db.student.aggregate( [ <br />
{$unwind : "$score"},<br />
{$group: {<br />
"_id": {"name" :"$name"} , <br />
"qty":{"$sum" : "$score.mark"}<br />
}<br />
}<br />
] )</td>
</tr>
</tbody>
</table>
The Score values are arrays recording subjects and marks. They need to be split to correspond to each student for further grouping and summarization. This involves the cooperation of <span style="font-family: inherit;">$unwind and $group operators.</span><br />
<span style="font-family: inherit;"><br /></span>
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"student.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.conj(score).groups(subject:SUBJECT;avg(mark):AVG) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.new(name:NAME,score.sum(mark):TOTAL) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
Average of each subject:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="50%">LESSON</th>
<th style="vertical-align: top;" width="50%">AVG</th>
</tr>
<tr>
<td style="vertical-align: top;">Chemical </td>
<td style="vertical-align: top;">72.0 </td>
</tr>
<tr>
<td style="vertical-align: top;">Math </td>
<td style="vertical-align: top;">81.0 </td>
</tr>
<tr>
<td style="vertical-align: top;">Physics </td>
<td style="vertical-align: top;">76.0 </td>
</tr>
</tbody>
</table>
<br />
Total mark of each student:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="50%">NAME</th>
<th style="vertical-align: top;" width="50%">TOTAL</th>
</tr>
<tr>
<td style="vertical-align: top;">Tom </td>
<td style="vertical-align: top;">132 </td>
</tr>
<tr>
<td style="vertical-align: top;">Jerry </td>
<td style="vertical-align: top;">173 </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read in data from <em>student</em> table.<br />
A3: Concatenate each Score value into a table sequence, group the table by subject and calculate the average.<br />
A4: Calculate the total mark of each student and return a table sequence made up of two columns – NAME and TOTAL. The <em>new()</em> function creates a new table sequence.<br />
A5: Close the database connection.<br />
<br />
<span style="font-size: large;"><b>2. A document with sub-documents</b></span><br />
Calculate sum of data in the sub-documents. For example, calculate the sum of income and output respectively for each record.<br />
<br />
Test data:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id</th>
<th style="vertical-align: top;" width="45%">income</th>
<th style="vertical-align: top;" width="45%">output</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">{"cpu":1000, "mem":500, "mouse":"100"} </td>
<td style="vertical-align: top;">{"cpu":1000, "mem":600 ,"mouse":"120"} </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">{"cpu":2000, "mem":1000, "mouse":"50","mainboard":500 } </td>
<td style="vertical-align: top;">{"cpu":1500, "mem":300 } </td>
</tr>
</tbody>
</table>
<br />
Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id</th>
<th style="vertical-align: top;" width="45%">income</th>
<th style="vertical-align: top;" width="45%">output</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1600 </td>
<td style="vertical-align: top;">1720 </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">3550 </td>
<td style="vertical-align: top;">1800 </td>
</tr>
</tbody>
</table>
<br />
Mongodb script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">var fields = ["income", "output"];<br />
db.computer.aggregate([<br />
{ <br />
$project:{ <br />
"values":{ <br />
$filter:{ <br />
input:{ <br />
"$objectToArray":"$$ROOT"<br />
},<br />
cond:{ <br />
$in:[ <br />
"$$this.k",<br />
fields<br />
]<br />
}<br />
}<br />
}<br />
}<br />
},<br />
{ <br />
$unwind:"$values"<br />
},<br />
{ <br />
$project:{ <br />
key:"$values.k",<br />
values:{ <br />
"$sum":{ <br />
"$let":{ <br />
"vars":{ <br />
"item":{ <br />
"$objectToArray":"$values.v"<br />
}<br />
},<br />
"in":"$$item.v"<br />
}<br />
}<br />
}<br />
}<br />
},<br />
{$sort: {"_id":-1}},<br />
{ "$group": {<br />
"_id": "$_id",<br />
'income':{"$first": "$values"},<br />
"output":{"$last": "$values"}<br />
}},<br />
]);</td>
</tr>
</tbody>
</table>
<br _id="" an="" and="" array="" as="" br="" by="" calculate="" data="" each="" fields.="" filter="" group="" in="" income="" into="" items="" join="" of="" output="" part="" record="" records="" sort="" splits="" stores="" sum="" the="" unwind="" up="" />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"computer.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.new(_id:ID,income.array().sum():INCOME,output.array().sum():OUTPUT) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
Result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">ID</th>
<th style="vertical-align: top;" width="45%">INCOME</th>
<th style="vertical-align: top;" width="45%">OUTPUT</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1600.0 </td>
<td style="vertical-align: top;">1720.0 </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">3550.0 </td>
<td style="vertical-align: top;">1800.0 </td>
</tr>
</tbody>
</table>
SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read in data from <em>computer</em> table.<br />
A3:Convert income value and output value respectively into a sequence to calculate the sum, and then join up with ID field to generate a new table sequence.<br />
A4: Close the database connection.<br />
<br />
The SPL code retrieves field values from each sub-document and calculates sum. It is much simpler than the MongoDB code. It appears that the embedded sub-documents and the embedded arrays are similar, but be careful not to confuse them. The scripts of handling them are slightly different.<br />
<br />
<b><span style="font-size: large;">3. A document grouped by segment</span></b><br />
Count the records in each segment. For example, the following data is divided by ranges of sales; find the number of records in each segment.<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id</th>
<th style="vertical-align: top;" width="30%">NAME</th>
<th style="vertical-align: top;" width="30%">STATE</th>
<th style="vertical-align: top;" width="30%">SALES</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">Ashley </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">11000 </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">Rachel </td>
<td style="vertical-align: top;">Montana </td>
<td style="vertical-align: top;">9000 </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">Emily </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">8800 </td>
</tr>
<tr>
<td style="vertical-align: top;">4 </td>
<td style="vertical-align: top;">Matthew </td>
<td style="vertical-align: top;">Texas </td>
<td style="vertical-align: top;">8000 </td>
</tr>
<tr>
<td style="vertical-align: top;">5 </td>
<td style="vertical-align: top;">Alexis </td>
<td style="vertical-align: top;">Illinois </td>
<td style="vertical-align: top;">14000 </td>
</tr>
</tbody>
</table>
<br />
Grouping conditions: 0-3000; 3000-5000; 5000-7500; 7500-10000; above 10000.<br />
<br />
Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="50%">Segment</th>
<th style="vertical-align: top;" width="50%">number</th>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">3 </td>
</tr>
<tr>
<td style="vertical-align: top;">4 </td>
<td style="vertical-align: top;">2 </td>
</tr>
</tbody>
</table>
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">var a_count=0;<br />
var b_count=0;<br />
var c_count=0;<br />
var d_count=0;<br />
var e_count=0;<br />
db.sales.find({<br />
}).forEach( <br />
function(myDoc) { <br />
if (myDoc.SALES <3000) { <br />
a_count += 1;<br />
}<br />
else if (myDoc.SALES <5000) { <br />
b_count += 1;<br />
}<br />
else if (myDoc.SALES <7500) { <br />
c_count += 1;<br />
}<br />
else if (myDoc.SALES <10000) { <br />
d_count += 1;<br />
}<br />
else { <br />
e_count += 1;<br />
} <br />
} <br />
);<br />
print("a_count="+a_count)<br />
print("b_count="+b_count)<br />
print("c_count="+c_count)<br />
print("d_count="+d_count)<br />
print("e_count="+e_count)</td>
</tr>
</tbody>
</table>
<br />
It’s complicated to implement conditional grouping by segment in MongoDB because the database doesn’t provide the corresponding API. The above script is one of the possibilities to handle the computation.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">[3000,5000,7500,10000,15000] </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A2,"sales.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A3.groups(A1.pseg(int(~.SALES)):Segment;count(1): number) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A2.close() </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1: Define the ranges of SALES.<br />
A2: Connect to MongoDB database.<br />
A3: Read in data from <em>sales</em> table.<br />
A4: Count the records according to the SALES ranges. The <em>pseg()</em> function returns the segment number containing the current record. The <em>int()</em> function converts data into an integer.<br />
A5: Close the database connection.<br />
The use of <em>pseg()</em> function makes a concise script.<br />
<br />
<b><span style="font-size: large;">4. Union of same-structure documents</span></b><br />
To union the following employee tables:<br />
<em>Emp1</em>:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id </th>
<th style="vertical-align: top;" width="18%">NAME </th>
<th style="vertical-align: top;" width="18%">STATE </th>
<th style="vertical-align: top;" width="18%">HIREDATE </th>
<th style="vertical-align: top;" width="18%">DEPT </th>
<th style="vertical-align: top;" width="18%">SALARY </th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">Ashley </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">2008-03-16 </td>
<td style="vertical-align: top;">Finance </td>
<td style="vertical-align: top;">11000 </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">Rachel </td>
<td style="vertical-align: top;">Michigan </td>
<td style="vertical-align: top;">2001-04-16 </td>
<td style="vertical-align: top;">Sales </td>
<td style="vertical-align: top;">9000 </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">Emily </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">2011-07-11 </td>
<td style="vertical-align: top;">HR </td>
<td style="vertical-align: top;">8800 </td>
</tr>
<tr>
<td style="vertical-align: top;">4 </td>
<td style="vertical-align: top;">Matthew </td>
<td style="vertical-align: top;">Texas </td>
<td style="vertical-align: top;">2003-03-06 </td>
<td style="vertical-align: top;">R&D </td>
<td style="vertical-align: top;">8000 </td>
</tr>
<tr>
<td style="vertical-align: top;">5 </td>
<td style="vertical-align: top;">Alexis </td>
<td style="vertical-align: top;">Illinois </td>
<td style="vertical-align: top;">2008-03-10 </td>
<td style="vertical-align: top;">Sale </td>
<td style="vertical-align: top;">14000 </td>
</tr>
</tbody>
</table>
<em>Emp2:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id </th>
<th style="vertical-align: top;" width="18%">NAME </th>
<th style="vertical-align: top;" width="18%">STATE </th>
<th style="vertical-align: top;" width="18%">HIREDATE </th>
<th style="vertical-align: top;" width="18%">DEPT </th>
<th style="vertical-align: top;" width="18%">SALARY </th>
</tr>
<tr>
<td style="vertical-align: top;">10 </td>
<td style="vertical-align: top;">Jacob </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">2009-03-14 </td>
<td style="vertical-align: top;">Sales </td>
<td style="vertical-align: top;">13000 </td>
</tr>
<tr>
<td style="vertical-align: top;">12 </td>
<td style="vertical-align: top;">Jessica </td>
<td style="vertical-align: top;">Florida </td>
<td style="vertical-align: top;">2011-04-19 </td>
<td style="vertical-align: top;">Sales </td>
<td style="vertical-align: top;">9500 </td>
</tr>
<tr>
<td style="vertical-align: top;">13 </td>
<td style="vertical-align: top;">Daniel </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">2001-02-11 </td>
<td style="vertical-align: top;">HR </td>
<td style="vertical-align: top;">7800 </td>
</tr>
<tr>
<td style="vertical-align: top;">14 </td>
<td style="vertical-align: top;">Alyssa </td>
<td style="vertical-align: top;">Montana </td>
<td style="vertical-align: top;">2013-09-06 </td>
<td style="vertical-align: top;">R&D </td>
<td style="vertical-align: top;">8000 </td>
</tr>
<tr>
<td style="vertical-align: top;">15 </td>
<td style="vertical-align: top;">Hannah </td>
<td style="vertical-align: top;">Florida </td>
<td style="vertical-align: top;">2015-06-10 </td>
<td style="vertical-align: top;">Sales </td>
<td style="vertical-align: top;">12500 </td>
</tr>
</tbody>
</table>
<br />
Desired unioned table:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id </th>
<th style="vertical-align: top;" width="18%">NAME </th>
<th style="vertical-align: top;" width="18%">STATE </th>
<th style="vertical-align: top;" width="18%">HIREDATE </th>
<th style="vertical-align: top;" width="18%">DEPT </th>
<th style="vertical-align: top;" width="18%">SALARY </th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">Ashley </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">2008-03-16 </td>
<td style="vertical-align: top;">Finance </td>
<td style="vertical-align: top;">11000 </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">Rachel </td>
<td style="vertical-align: top;">Michigan </td>
<td style="vertical-align: top;">2001-04-16 </td>
<td style="vertical-align: top;">Sales </td>
<td style="vertical-align: top;">9000 </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">Emily </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">2011-07-11 </td>
<td style="vertical-align: top;">HR </td>
<td style="vertical-align: top;">8800 </td>
</tr>
<tr>
<td style="vertical-align: top;">4 </td>
<td style="vertical-align: top;">Matthew </td>
<td style="vertical-align: top;">Texas </td>
<td style="vertical-align: top;">2003-03-06 </td>
<td style="vertical-align: top;">R&D </td>
<td style="vertical-align: top;">8000 </td>
</tr>
<tr>
<td style="vertical-align: top;">5 </td>
<td style="vertical-align: top;">Alexis </td>
<td style="vertical-align: top;">Illinois </td>
<td style="vertical-align: top;">2008-03-10 </td>
<td style="vertical-align: top;">Sale </td>
<td style="vertical-align: top;">14000 </td>
</tr>
<tr>
<td style="vertical-align: top;">10 </td>
<td style="vertical-align: top;">Jacob </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">2009-03-14 </td>
<td style="vertical-align: top;">Sales </td>
<td style="vertical-align: top;">13000 </td>
</tr>
<tr>
<td style="vertical-align: top;">12 </td>
<td style="vertical-align: top;">Jessica </td>
<td style="vertical-align: top;">Florida </td>
<td style="vertical-align: top;">2011-04-19 </td>
<td style="vertical-align: top;">Sales </td>
<td style="vertical-align: top;">9500 </td>
</tr>
<tr>
<td style="vertical-align: top;">13 </td>
<td style="vertical-align: top;">Daniel </td>
<td style="vertical-align: top;">New York </td>
<td style="vertical-align: top;">2001-02-11 </td>
<td style="vertical-align: top;">HR </td>
<td style="vertical-align: top;">7800 </td>
</tr>
<tr>
<td style="vertical-align: top;">14 </td>
<td style="vertical-align: top;">Alyssa </td>
<td style="vertical-align: top;">Montana </td>
<td style="vertical-align: top;">2013-09-06 </td>
<td style="vertical-align: top;">R&D </td>
<td style="vertical-align: top;">8000 </td>
</tr>
<tr>
<td style="vertical-align: top;">15 </td>
<td style="vertical-align: top;">Hannah </td>
<td style="vertical-align: top;">Florida </td>
<td style="vertical-align: top;">2015-06-10 </td>
<td style="vertical-align: top;">Sales </td>
<td style="vertical-align: top;">12500 </td>
</tr>
</tbody>
</table>
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.emp1.aggregate([ <br />
{"$limit": 1},<br />
{ "$facet": {<br />
"collection1": [<br />
{"$limit": 1},<br />
{ "$lookup": {<br />
"from": "emp1",<br />
"pipeline": [{"$match": {} }],<br />
"as": "collection1"<br />
}}<br />
],<br />
"collection2": [<br />
{"$limit": 1},<br />
{ "$lookup": {<br />
"from": "emp2",<br />
"pipeline": [{"$match": {} }],<br />
"as": "collection2"<br />
}}<br />
]<br />
}},<br />
{ "$project": {<br />
"data": {<br />
"$concatArrays": [<br />
{"$arrayElemAt": ["$collection1.collection1", 0] },<br />
{"$arrayElemAt": ["$collection2.collection2", 0] },<br />
]<br />
}<br />
}},<br />
{"$unwind": "$data"},<br />
{"$replaceRoot": { "newRoot": "$data"} }<br />
])</td>
</tr>
</tbody>
</table>
$facet stores the two tables in two arrays respectively; $concatArrays concatenates the arrays; $unwind splits the sub-records and presents it at the outermost layer. By contrast, SPL handles it clearly and simply.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"emp1.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"emp2.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2|A3 </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read in data from <em>emp1</em> table.<br />
A3: Read in data from <em>emp</em>2 table.<br />
A4: Concatenate the two tables.<br />
A5: Close the database connection.<br />
The SPL script is natural and easy to understand. But for a SQL user who begins trying MongDB, they could be puzzled by the MongoDB-style data concatenation.<br />
<br />
<b><span style="font-size: large;">5. Association with embedded structures (1)</span></b><br />
This involves two associated tables. One of table A’s field is associated with the sub-documents in table B, and the to-be-analyzed data is contained in the sub-documents. For example, the <em>childs</em> field of <em>childsgroup</em> table contains embedded arrays, in which the <em>name</em> item needs to be summarized.<br />
<br />
Test data:<br />
<em>history:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id </th>
<th style="vertical-align: top;" width="30%">id </th>
<th style="vertical-align: top;" width="30%">History </th>
<th style="vertical-align: top;" width="30%">child_id </th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">001 </td>
<td style="vertical-align: top;">today worked </td>
<td style="vertical-align: top;">ch001 </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">002 </td>
<td style="vertical-align: top;">Working </td>
<td style="vertical-align: top;">ch004 </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">003 </td>
<td style="vertical-align: top;">now working </td>
<td style="vertical-align: top;">ch009 </td>
</tr>
</tbody>
</table>
<em>childsgroup:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id </th>
<th style="vertical-align: top;" width="20%">groupid </th>
<th style="vertical-align: top;" width="20%">name </th>
<th style="vertical-align: top;" width="50%">childs </th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">g001 </td>
<td style="vertical-align: top;">group1 </td>
<td style="vertical-align: top;">{"id":"ch001","info":{"name":"a"}},<br />
{"id":"ch002","info":{"name":"b"}} </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">g002 </td>
<td style="vertical-align: top;">group1 </td>
<td style="vertical-align: top;">{"id":"ch004","info":{"name":"c"}},<br />
{"id":"ch009","info":{"name":"d"}} </td>
</tr>
</tbody>
</table>
<br />
The <em>child_id</em> field in <em>history</em> table associates with <em>childs.id</em> in <em>childsgroup</em> table. Below is the desired joining result:<br />
{<br />
"_id" : ObjectId("5bab2ae8ab2f1bdb4f434bc3"),<br />
"id" : "001",<br />
"history" : "today worked",<br />
"child_id" : "ch001",<br />
"childInfo" :<br />
{<br />
"name" : "a"<br />
}<br />
………………<br />
}<br />
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.history.aggregate([<br />
{$lookup: {<br />
from: "childsgroup",<br />
let: {child_id: "$child_id"},<br />
pipeline: [<br />
{$match: { $expr: { $in: [ "$$child_id", "$childs.id"] } } },<br />
{$unwind: "$childs"},<br />
{$match: { $expr: { $eq: [ "$childs.id", "$$child_id"] } } },<br />
{$replaceRoot: { newRoot: "$childs.info"} }<br />
],<br />
as: "childInfo"<br />
}},<br />
{"$unwind": "$childInfo"}<br />
])</td>
</tr>
</tbody>
</table>
The script uses five operators, including lookup, pipeline, match, unwind and replaceRoot, to handle the computation. It’s complicated and difficult to write.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"history.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"childsgroup.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A3.conj(childs) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.join(child_id,A4:id,info.name:name) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">6 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
Joining result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_id</th>
<th style="vertical-align: top;" width="18%">id</th>
<th style="vertical-align: top;" width="18%">history</th>
<th style="vertical-align: top;" width="18%">child_id</th>
<th style="vertical-align: top;" width="18%">name</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">001 </td>
<td style="vertical-align: top;">today worked </td>
<td style="vertical-align: top;">ch001 </td>
<td style="vertical-align: top;">a </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">002 </td>
<td style="vertical-align: top;">working </td>
<td style="vertical-align: top;">ch004 </td>
<td style="vertical-align: top;">c </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">003 </td>
<td style="vertical-align: top;">now working </td>
<td style="vertical-align: top;">ch009 </td>
<td style="vertical-align: top;">d </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read in data from <em>history</em> table.<br />
A3:Read in data from <em>childsgroup</em> table.<br />
A4: Concatenate the array values in <em>childsgroup</em> table’s <em>childs</em> field into a table sequence.<br />
A5: Join <em>history</em> table with A4’s <em>childs</em> table via the associated fields <em>child_id</em> and <em>id</em> and append a name field to generate a new table sequence.<br />
A6:Close the database connection.<br />
The SPL script is simple and efficient.<br />
<br />
<b><span style="font-size: large;">6. Association with embedded structures (2)</span></b><br />
There are two associated tables. Table A is associated with table B’s embedded documents and combine table A’s data under the embedded documents. For example, <em>txtPost</em> table’s <em>Comment</em> field contains array values; combine <em>comment_content</em> field of <em>txtComment</em> table under the arrays.<br />
<br />
<em>txtComment</em>:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_ID</th>
<th style="vertical-align: top;" width="45%">comment_no</th>
<th style="vertical-align: top;" width="45%">comment_content</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">143 </td>
<td style="vertical-align: top;">test test </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">140 </td>
<td style="vertical-align: top;">math </td>
</tr>
</tbody>
</table>
<em>txtPost:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_ID</th>
<th style="vertical-align: top;" width="20%">post_no</th>
<th style="vertical-align: top;" width="70%">Comment</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">48 </td>
<td style="vertical-align: top;">[{"comment_no" : 143, "comment_group" : 1} ] </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">47 </td>
<td style="vertical-align: top;">[{"comment_no" : 140, "comment_group" : 2},<br />
{"comment_no" : 143, "comment_group" : 3} ] </td>
</tr>
</tbody>
</table>
<br />
Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="10%">_ID</th>
<th style="vertical-align: top;" width="15%">post_no</th>
<th style="vertical-align: top;" width="75%">Comment</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">48 </td>
<td style="vertical-align: top;">[{"comment_no" : 143, "comment_group" : 1,"comment_content" : "test test"} ] </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">47 </td>
<td style="vertical-align: top;">[{"comment_no" : 140, "comment_group" : 2,"comment_content" : "math"},<br />
{"comment_no" : 143, "comment_group" : 3,"comment_content" : "test test"} ] </td>
</tr>
</tbody>
</table>
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.getCollection("txtPost").aggregate([ <br />
{"$unwind": "$comment"},<br />
{ "$lookup": {<br />
"from": "txtComment",<br />
"localField": "comment.comment_no",<br />
"foreignField": "comment_no",<br />
"as": "comment.comment_content"<br />
}},<br />
{"$unwind": "$comment.comment_content"},<br />
{"$addFields": { "comment.comment_content":"$comment.comment_content.comment_content"}},<br />
{ "$group": {<br />
"_id": "$_id",<br />
'post_no':{"$first": "$post_no"},<br />
"comment": {"$push": "$comment"}<br />
}},<br />
<br />
]).pretty()</td>
</tr>
</tbody>
</table>
Split <em>txtPost</em> records according to members of <em>Comment</em> arrays into more records, join them with records of <em>txtComment</em>, store the joining result as an array, split the array into records, move <em>comment_content</em> values under <em>Comment</em> field, and group and concatenate the records.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"txtPost.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"txtComment.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.conj(comment.derive(A2.post_no:pno)) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A4.join(comment_no,A3:comment_no,comment_content:Content) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">6 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A5.group(pno;~:comment) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">7 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1:Connect to MongoDB database.<br />
A2:Read data from <em>txtPost</em> table.<br />
A3:Read data from <em>txComment</em> table.<br />
A4:Create a table sequence with A2’s <em>Comment</em> field and <em>post_no</em> field that is renamed <em>pno</em>.<br />
A5:Join A4’s table sequence with A3’s table sequence via <em>comment_no</em> and append <em>comment_content</em> field that is renamed <em>Content</em>.<br />
A6:Group records by pno and return the current table; <em>~</em> represents the current record.<br />
A7:Close the database connection.<br />
<br />
<b><span style="font-size: large;">7. Association with embedded structures (3)</span></b><br />
This involves two associated tables. Table A is associated with the sub-documents in table B, and the to-be-returned information is contained in the joined record. For example, <em>product</em> field in <em>collection2</em> contains array values and the joined result needs to include fields in <em>isCompleted</em> array in <em>collection2</em>.<br />
<br />
Test data:<br />
<em>collection1:</em><br />
<pre><textarea style="height: 179px; margin: 0px; width: 352px;">{
_id: '5bc2e44a106342152cd83e97',
description:
{
status: 'Good',
machine: 'X'
},
order: 'A',
lot: '1'
};
</textarea><code class="hljs javascript" style="max-height: 714px;">
</code></pre>
<em>collection2</em>:<br />
<pre><textarea style="height: 193px; margin: 0px; width: 353px;">{
_id: '5bc2e44a106342152cd83e80',
isCompleted: false,
serialNo: '1',
batchNo: '2',
<!-- note the subdocuments here-->
product: [
{ order: 'A', lot: '1' },
{ order: 'A', lot: '2' }
]
}
</textarea><code class="hljs javascript" style="max-height: 714px;"><span class="xml">
</span></code></pre>
<pre></pre>
Desired result:<br />
<pre><textarea style="height: 219px; margin: 0px; width: 355px;">{
_id: 5bc2e44a106342152cd83e97,
description:
{
status: 'Good',
machine: 'X',
},
order: 'A',
lot: '1' ,
isCompleted: false,
serialNo: '1',
batchNo: '2'
}
</textarea>
</pre>
<pre></pre>
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.collection1.aggregate([{ <br />
$lookup: {<br />
from: "collection2",<br />
let: {order: "$order", lot: "$lot"},<br />
pipeline: [{<br />
$match: { <br />
$expr:{$in: [ { order: "$$order", lot: "$$lot"}, "$product"] }<br />
} <br />
}], <br />
as: "isCompleted" <br />
} <br />
}, {<br />
$addFields: { <br />
"isCompleted": {$arrayElemAt: [ "$isCompleted", 0] }<br />
} <br />
}, {<br />
$addFields: { // add the required fields to the top level structure <br />
"isCompleted": "$isCompleted.isCompleted",<br />
"serialNo": "$isCompleted.serialNo",<br />
"batchNo": "$isCompleted.batchNo" <br />
} <br />
}])</td>
</tr>
</tbody>
</table>
<br />
$lookup performs an associated query between the two tables. The first $addFields gets the first field from <em>isCompleted</em> array, and the second $addFields adds the other required fields.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"collection1.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"collection2.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A3.conj(A2.select(order:A3.product.order,lot:A3.product.lot).derive(A3.serialNo:sno,A3.batchNo:bno)) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1:Connect to MongoDB database.<br />
A2:Read data from <em>collection1</em> table.<br />
A3:Read data from <em>collection2</em> table.<br />
A4:Query A2’s table according to <em>order</em> field and <em>lot</em> field, add A3’s <em>serialNo</em> field and <em>batchNo</em> field, and return the joined tabled table sequence.<br />
A5:Close the database connection.<br />
This instance filters the sub-documents to get the eligible records to form a new table sequence.<br />
<br />
<b><span style="font-size: large;">8. Multi-field grouping & summarization</span></b><br />
Group data by the grouping field and calculate the sum in each group and sub-group. For example, group the following data by <em>addr</em> and <em>book</em> to find the number under different books and the total number of books in each group.<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="50%">addr</th>
<th style="vertical-align: top;" width="50%">book</th>
</tr>
<tr>
<td style="vertical-align: top;">address1 </td>
<td style="vertical-align: top;">book1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address2 </td>
<td style="vertical-align: top;">book1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address1 </td>
<td style="vertical-align: top;">book5 </td>
</tr>
<tr>
<td style="vertical-align: top;">address3 </td>
<td style="vertical-align: top;">book9 </td>
</tr>
<tr>
<td style="vertical-align: top;">address2 </td>
<td style="vertical-align: top;">book5 </td>
</tr>
<tr>
<td style="vertical-align: top;">address2 </td>
<td style="vertical-align: top;">book1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address1 </td>
<td style="vertical-align: top;">book1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address15 </td>
<td style="vertical-align: top;">book1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address4 </td>
<td style="vertical-align: top;">book3 </td>
</tr>
<tr>
<td style="vertical-align: top;">address5 </td>
<td style="vertical-align: top;">book1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address7 </td>
<td style="vertical-align: top;">book11 </td>
</tr>
<tr>
<td style="vertical-align: top;">address1 </td>
<td style="vertical-align: top;">book1 </td>
</tr>
</tbody>
</table>
<br />
Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="25%">_id</th>
<th style="vertical-align: top;" width="25%">Total</th>
<th style="vertical-align: top;" width="25%">books</th>
<th style="vertical-align: top;" width="25%">Count</th>
</tr>
<tr>
<td style="vertical-align: top;">address1 </td>
<td style="vertical-align: top;">4 </td>
<td style="vertical-align: top;">book1 </td>
<td style="vertical-align: top;">3 </td>
</tr>
<tr>
<td style="vertical-align: top;"></td>
<td style="vertical-align: top;"></td>
<td style="vertical-align: top;">book5 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address15 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">book1 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address2 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">book1 </td>
<td style="vertical-align: top;">2 </td>
</tr>
<tr>
<td style="vertical-align: top;"></td>
<td style="vertical-align: top;"></td>
<td style="vertical-align: top;">book5 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address3 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">book9 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address4 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">book3 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address5 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">book1 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address7 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">book11 </td>
<td style="vertical-align: top;">1 </td>
</tr>
</tbody>
</table>
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.books.aggregate([<br />
{ "$group": {<br />
"_id": {<br />
"addr": "$addr",<br />
"book": "$book"<br />
},<br />
"bookCount": {"$sum": 1}<br />
}},<br />
{ "$group": {<br />
"_id": "$_id.addr",<br />
"books": { <br />
"$push": { <br />
"book": "$_id.book",<br />
"count": "$bookCount"<br />
},<br />
},<br />
"count": {"$sum": "$bookCount"}<br />
}},<br />
{"$sort": { "count": -1} },<br />
{ "$project": {<br />
"books": {"$slice": [ "$books", 2] },<br />
"count": 1<br />
}}<br />
]).pretty()</td>
</tr>
</tbody>
</table>
Count different books by <em>addr</em> and <em>book</em>, then group by <em>addr</em> to find the total number of books in each group, and re-arrange the records by the required order.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"books.find()") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.groups(addr,book;count(book): Count) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A3.groups(addr;sum(Count):Total) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A3.join(addr,A4:addr,Total) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">6 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
Result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="25%">Address</th>
<th style="vertical-align: top;" width="25%">book</th>
<th style="vertical-align: top;" width="25%">Count</th>
<th style="vertical-align: top;" width="25%">Total</th>
</tr>
<tr>
<td style="vertical-align: top;">address1 </td>
<td style="vertical-align: top;">book1 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">4 </td>
</tr>
<tr>
<td style="vertical-align: top;">address1 </td>
<td style="vertical-align: top;">book5 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">4 </td>
</tr>
<tr>
<td style="vertical-align: top;">address15 </td>
<td style="vertical-align: top;">book1 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address2 </td>
<td style="vertical-align: top;">book1 </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">3 </td>
</tr>
<tr>
<td style="vertical-align: top;">address2 </td>
<td style="vertical-align: top;">book5 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">3 </td>
</tr>
<tr>
<td style="vertical-align: top;">address3 </td>
<td style="vertical-align: top;">book9 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address4 </td>
<td style="vertical-align: top;">book3 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address5 </td>
<td style="vertical-align: top;">book1 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1 </td>
</tr>
<tr>
<td style="vertical-align: top;">address7 </td>
<td style="vertical-align: top;">book11 </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1 </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read data from <em>books</em> table.<br />
A3: Group data by <em>addr</em> and <em>book</em> to count different books.<br />
A4: Group A3’s table sequence by <em>addr</em> and find the total number of books in each group.<br />
A5: Join A3 and A4 via <em>addr</em> and add Total field to the joined table sequence.<br />
A6: Close the database connection.<br />
<br />
<span style="font-size: large;"><b>9. Association with selected fields</b></span><br />
Create a new table through association and with selected fields.<br />
<em>collection1:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="30%">user1</th>
<th style="vertical-align: top;" width="30%">user2</th>
<th style="vertical-align: top;" width="40%">income</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">0.56 </td>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">0.26 </td>
</tr>
</tbody>
</table>
<em>collection2:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="30%">user1</th>
<th style="vertical-align: top;" width="30%">user2</th>
<th style="vertical-align: top;" width="40%">output</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">0.3 </td>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">0.4 </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">0.5 </td>
</tr>
</tbody>
</table>
<br />
Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="25%">user1</th>
<th style="vertical-align: top;" width="25%">user2</th>
<th style="vertical-align: top;" width="25%">income</th>
<th style="vertical-align: top;" width="25%">output</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">0.56 </td>
<td style="vertical-align: top;">0.3 </td>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">0.26 </td>
<td style="vertical-align: top;">0.4 </td>
</tr>
</tbody>
</table>
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.c1.aggregate([<br />
{ "$lookup": { <br />
"from": "c2", <br />
"localField": "user1", <br />
"foreignField": "user1", <br />
"as": "collection2_doc"<br />
}}, <br />
{"$unwind": "$collection2_doc"},<br />
{ "$redact": { <br />
"$cond": [<br />
{"$eq": [ "$user2", "$collection2_doc.user2"] }, <br />
"$$KEEP", <br />
"$$PRUNE"<br />
]<br />
}}, <br />
{ "$project": { <br />
"user1": 1, <br />
"user2": 1, <br />
"income": "$income", <br />
"output": "$collection2_doc. output"<br />
}}<br />
]).pretty()</td>
</tr>
</tbody>
</table>
$lookup performs an associated query. $redact traverses records to perform conditional handling. $project selects the desired fields.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"c1.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"c2.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.join(user1:user2,A3:user1:user2,output) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read data from <em>collection1</em> table.<br />
A3: Read data from <em>collection2</em> table.<br />
A4: Join the two tables by <em>user1</em> and <em>user2</em>, append A3’s <em>output</em> field and return a new table sequence.<br />
A5: Close the database connection.<br />
Combine some of fields in two tables via a join into a new table.<br />
<br />
<b><span style="font-size: large;">10. Multi-table association</span></b><br />
This is the association between more than two tables to get a merged table.<br />
<em>Doc1:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id </th>
<th style="vertical-align: top;" width="40%">firstName </th>
<th style="vertical-align: top;" width="40%">lastName </th>
</tr>
<tr>
<td style="vertical-align: top;">U001 </td>
<td style="vertical-align: top;">shubham </td>
<td style="vertical-align: top;">verma </td>
</tr>
</tbody>
</table>
<em>Doc2:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id </th>
<th style="vertical-align: top;" width="20%">userId</th>
<th style="vertical-align: top;" width="30%">address</th>
<th style="vertical-align: top;" width="30%">mob</th>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">U001 </td>
<td style="vertical-align: top;">Gurgaon </td>
<td style="vertical-align: top;">9876543200 </td>
</tr>
</tbody>
</table>
<em>Doc3:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id </th>
<th style="vertical-align: top;" width="20%">userId</th>
<th style="vertical-align: top;" width="30%">fbURLs</th>
<th style="vertical-align: top;" width="30%">twitterURLs</th>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">U001 </td>
<td style="vertical-align: top;">http://www.facebook.com </td>
<td style="vertical-align: top;">http://www.twitter.com </td>
</tr>
</tbody>
</table>
<br />
Merged result:<br />
<pre><textarea style="height: 213px; margin: 0px; width: 375px;">{
"_id" : ObjectId("5901a4c63541b7d5d3293766"),
"firstName" : "shubham",
"lastName" : "verma",
"address" : {
"address" : "Gurgaon"
},
"social" : {
"fbURLs" : "http://www.facebook.com",
"twitterURLs" : "http://www.twitter.com"
}
}
</textarea><code class="hljs json" style="max-height: 714px;">
</code></pre>
<pre></pre>
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.doc1.aggregate([<br />
{$match: { _id: ObjectId("5901a4c63541b7d5d3293766") } },<br />
{<br />
$lookup:<br />
{<br />
from: "doc2",<br />
localField: "_id",<br />
foreignField: "userId",<br />
as: "address"<br />
}<br />
},<br />
{<br />
$unwind: "$address"<br />
},<br />
{<br />
$project: {<br />
"address._id": 0,<br />
"address.userId": 0,<br />
"address.mob": 0<br />
}<br />
},<br />
{<br />
$lookup:<br />
{<br />
from: "doc3",<br />
localField: "_id",<br />
foreignField: "userId",<br />
as: "social"<br />
}<br />
},<br />
{<br />
$unwind: "$social"<br />
},<br />
<br />
{ <br />
$project: { <br />
"social._id": 0, <br />
"social.userId": 0 <br />
}<br />
}<br />
]).pretty();</td>
</tr>
</tbody>
</table>
There can be different scripts to do this and various merged results in MongoDB thanks to the database’s unique data structure.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"doc1.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"doc2.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"doc3.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.join(_id,A3:userId,address,mob) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">6 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A5.join(_id,A4:userId,fbURLs,twitterURLs) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">7 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
This script is similar to that in the previous example, with only one more joined table. Every join adds a new field to form a merged table.<br />
Obviously, the SPL script is concise and coherent.<br />
<br />
<b><span style="font-size: large;">11. Conditional search</span></b><br />
Find the eligible records according to a specified array. In this example, the specified array is [“Chemical”, “Biology”, “Math”].<br />
<br />
Test data:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id</th>
<th style="vertical-align: top;" width="30%">Name</th>
<th style="vertical-align: top;" width="50%">Subject</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">jacker </td>
<td style="vertical-align: top;">[English, Chemical,Math, Physics] </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">tom </td>
<td style="vertical-align: top;">[Chinese, Chemical,Math, Biology] </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">Mint </td>
<td style="vertical-align: top;">[Chinese, History] </td>
</tr>
</tbody>
</table>
<br />
Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id</th>
<th style="vertical-align: top;" width="30%">Name</th>
<th style="vertical-align: top;" width="50%">Subject</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">Jacker </td>
<td style="vertical-align: top;">[Chemical,Math] </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">Tom </td>
<td style="vertical-align: top;">[Chemical,Math,Biology] </td>
</tr>
</tbody>
</table>
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">var field = ["Chemical", "Biology", "Math"]<br />
db.student.aggregate([<br />
{ "$project": {<br />
"name":1,<br />
"subjects": {<br />
"$filter": {<br />
"input": "$lesson",<br />
"cond": {<br />
"$in": [<br />
"$$this",<br />
field <br />
]<br />
}<br />
}<br />
},<br />
}},<br />
{"$project": {"name":1,"subjects":1,"sizeOfsubject": {"$size": "$subjects"} }},<br />
{$match: { "sizeOfsubject":{ $gt: 0}}}<br />
])</td>
</tr>
</tbody>
</table>
Find students who select the courses including chemical, biology and math.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">[Chemical, Biology, Math] </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A2,"student.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A3.select(subject^A1!=[]) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A4.new(name, ~.subject^A1) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">6 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A2.close() </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1:Define the searching condition, which is an array of subjects.<br />
A2:Connect to MongoDB database.<br />
A3:Read data from <em>student</em> table.<br />
A4:Get records where the Subject value contains at least one of the subjects in the specified array.<br />
A5:Generate a new table sequence consisting of name field and subject field to which a matching subject is added.<br />
A6:Close the database connection.<br />
The SPL script is concise and easy to understand.<br />
<br />
<b><span style="font-size: large;">12. Associated query by array values</span></b><br />
Get records from a table according to the array field in its associated table and generate a new table with certain fields.<br />
<br />
Test data:<br />
<em>users:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id</th>
<th style="vertical-align: top;" width="30%">Name</th>
<th style="vertical-align: top;" width="50%">workouts</th>
</tr>
<tr>
<td style="vertical-align: top;">1000 </td>
<td style="vertical-align: top;">xxx </td>
<td style="vertical-align: top;">[2,4,6] </td>
</tr>
<tr>
<td style="vertical-align: top;">1002 </td>
<td style="vertical-align: top;">yyy </td>
<td style="vertical-align: top;">[1,3,5] </td>
</tr>
</tbody>
</table>
<em>workouts:</em><br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="20%">_id</th>
<th style="vertical-align: top;" width="30%">Date</th>
<th style="vertical-align: top;" width="50%">Book</th>
</tr>
<tr>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1/1/2001 </td>
<td style="vertical-align: top;">Othello </td>
</tr>
<tr>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">2/2/2001 </td>
<td style="vertical-align: top;">A Midsummer Night's Dream </td>
</tr>
<tr>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">3/3/2001 </td>
<td style="vertical-align: top;">The Old Man and the Sea </td>
</tr>
<tr>
<td style="vertical-align: top;">4 </td>
<td style="vertical-align: top;">4/4/2001 </td>
<td style="vertical-align: top;">GULLIVER’S TRAVELS </td>
</tr>
<tr>
<td style="vertical-align: top;">5 </td>
<td style="vertical-align: top;">5/5/2001 </td>
<td style="vertical-align: top;">Pickwick Papers </td>
</tr>
<tr>
<td style="vertical-align: top;">6 </td>
<td style="vertical-align: top;">6/6/2001 </td>
<td style="vertical-align: top;">The Red and the Black </td>
</tr>
</tbody>
</table>
<br />
Desired result:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<th style="vertical-align: top;" width="15%">Name</th>
<th style="vertical-align: top;" width="15%">_id</th>
<th style="vertical-align: top;" width="20%">Date</th>
<th style="vertical-align: top;" width="50%">Book</th>
</tr>
<tr>
<td style="vertical-align: top;">xxx </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">2/2/2001 </td>
<td style="vertical-align: top;">A Midsummer Night's Dream </td>
</tr>
<tr>
<td style="vertical-align: top;">xxx </td>
<td style="vertical-align: top;">4 </td>
<td style="vertical-align: top;">4/4/2001 </td>
<td style="vertical-align: top;">GULLIVER’S TRAVELS </td>
</tr>
<tr>
<td style="vertical-align: top;">xxx </td>
<td style="vertical-align: top;">6 </td>
<td style="vertical-align: top;">6/6/2001 </td>
<td style="vertical-align: top;">The Red and the Black </td>
</tr>
<tr>
<td style="vertical-align: top;">yyy </td>
<td style="vertical-align: top;">1 </td>
<td style="vertical-align: top;">1/1/2001 </td>
<td style="vertical-align: top;">Othello </td>
</tr>
<tr>
<td style="vertical-align: top;">yyy </td>
<td style="vertical-align: top;">3 </td>
<td style="vertical-align: top;">3/3/2001 </td>
<td style="vertical-align: top;">The Old Man and the Sea </td>
</tr>
<tr>
<td style="vertical-align: top;">yyy </td>
<td style="vertical-align: top;">5 </td>
<td style="vertical-align: top;">5/5/2001 </td>
<td style="vertical-align: top;">Pickwick Papers </td>
</tr>
</tbody>
</table>
<br />
MongoDB script:<br />
<table border="1" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align: top;">db.users.aggregate([<br />
{ "$lookup": {<br />
"from" : "workouts", <br />
"localField" : "workouts", <br />
"foreignField" : "_id", <br />
"as" : "workoutDocumentsArray"<br />
}},<br />
{$project: { _id:0,workouts:0} } ,<br />
{"$unwind": "$workoutDocumentsArray"},<br />
<br />
{"$replaceRoot": { "newRoot": { $mergeObjects: [ "$$ROOT", "$workoutDocumentsArray"] } } }, <br />
{$project: { workoutDocumentsArray: 0} } <br />
]).pretty()</td>
</tr>
</tbody>
</table>
Put the result of associated query between <em>users</em> and <em>workouts</em> into an array, split the array and move the embedded document to the top level, and remove the unwanted fields.<br />
<br />
SPL script:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_open("mongodb://127.0.0.1:27017/raqdb") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"users.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mongo_shell(A1,"workouts.find()").fetch() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.conj(A3.select(A2.workouts^~.array(_id)!=[]).derive(A2.name)) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">>A1.close() </td>
</tr>
</tbody>
</table>
<br />
SPL script explanation:<br />
A1: Connect to MongoDB database.<br />
A2: Read data from <em>users</em> table.<br />
A3: Read data from <em>workouts</em> table.<br />
A4: Get records from <em>workouts</em> table where <em>_id</em> field is included in <em>workouts</em> field of A2’s table sequence, and add <em>name</em> field to the records.<br />
A5: Close the database connection.<br />
The operation is considered normal only if the matching result isn’t null. So <em>_id</em> field is converted into a sequence to make the comparison convenient in A4.<br />
<br />
Compared with relational databases, MongoDB stores data in a more complicated, more flexible way, has powerful and adaptable query syntax, and provides various functions and rich cooperative possibilities between them. It’s not easy to be proficient in MongoDB. esProc, however, features discreteness and ease of use to become the NoSQL database’s right-hand and help it play to its full potential.</div>
Huocxhttp://www.blogger.com/profile/02976232401731847120noreply@blogger.com0tag:blogger.com,1999:blog-5773662941385236123.post-12776587419031739312019-05-09T02:32:00.001-07:002019-05-09T02:32:23.766-07:00Solve some difficult problems in reporting tools such as Jasper<div class="content-reset article-content" data-author="pjf" data-link="http://c.raqsoft.com/article/1555587476131">
When making reports, we often encounter some problems which are difficult to solve by relying solely on reporting tools. This article will introduce how to use esProc SPL language to solve the practical problems raised by several Jasper reporting tool users in foreign forums. The solution here is not only applicable to Jasper, but also to other reporting tools.<br />
<br />
<span style="font-size: large;"><b>1. Calculating the account balance of each period</b></span><br />
<h2 id="toc_h2_0">
<a href="http://c.raqsoft.com/forward?goto=%231-calculating-the-account-balance-of-each-period" id="1-calculating-the-account-balance-of-each-period" rel="nofollow" target="_blank"></a></h2>
The data file data.csv stores the deposit and withdrawal of funds in each period of an account. When the initial balance of the account is known to be 43, we need to calculate the balance of each period according to the data file. A part of the source data is as follows:<br />
<br />
<table>
<tbody>
<tr>
<td style="vertical-align: top;">Inputs,Outputs<br />
0,10<br />
15,0<br />
22,0<br />
0,33<br />
0,15<br />
0,14<br />
36,0<br />
0,69<br />
2,0<br />
18,0 <br />
<br /></td>
</tr>
</tbody>
</table>
<br />
The desired report result is as follows:<br /><img alt="001png" src="http://img.raqsoft.com/file/2019/04/9e8a4df483f64d4aa2169ab7e7251c4b_001.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-color: transparent; background-image: none;" /><br />
<br />
When calculating the balance of each period according to the amount of deposit and withdrawal, cross-row calculation is needed, which can be realized by Jasper. However, the implementation steps are complex and difficult. With the help of esProc, it can be easily implemented. The detailed esProc SPL codes are as follows:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=file("data.csv").import@tc() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">return (t=43,A1.derive(t=t+Inputs-Outputs:Balance)) </td>
</tr>
</tbody>
</table>
<br />A1:Import the file, option @tc indicates that the file has a title line and is separated by a comma.<br />A2:Calculate the balance of each period and return the result to the report. Set the account initial value to 43, and add a column to A1 table, whose value is “the balance of the previous period + current Inputs-current Outputs”. Obviously, the result here is what we want the report to present.<br />
<br />
Save the above SPL codes to file <em>balance.dfx</em>.<br />
<br />
To present the result in report, we can use the JDBC interface that esProc provided. The report calls the esProc the same way it calls the stored procedure. Call balance() can be used to call and pass in parameters in Jasper’s SQL Designer. For detailed procedure, please refer to《<a href="https://data-preparation-for-birt.blogspot.com/2019/05/how-to-call-spl-script-in-jasperreport.html">How to call an SPL script in JasperReport</a>》.<br />
<br />
Then, design the simple list table in Jasper with the following template:<br /><img alt="002png" src="http://img.raqsoft.com/file/2019/04/aa13465499774cf6b6da94347e46c4cc_002.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-color: transparent; background-image: none;" /><br />
<br />
After preview, you can see the result of the report, as we requested.:<br /><img alt="003png" src="http://img.raqsoft.com/file/2019/04/637d3167e93e402fb4936f59e44c2751_003.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-color: transparent; background-image: none;" /><br />
<h2 id="toc_h2_1">
<br /></h2>
<b><span style="font-size: large;">2. Calculating loan instalments</span></b><br />
<h2 id="toc_h2_1">
<a href="http://c.raqsoft.com/forward?goto=%232-calculating-loan-instalments" id="2-calculating-loan-instalments" rel="nofollow" target="_blank"></a></h2>
Database table <em>loan</em> stores loan information, including loan amount, number of terms in months, and annual interest rate. Now we need to create a table, in which details of each term are listed under each loan information, incl. current repayment, current interest, current principal and principal balance.<br />
<br />
Part of the table <em>loan</em> data is as follows:<br />
<table>
<tbody>
<tr>
<th style="vertical-align: top;" width="25%">LoanID</th>
<th style="vertical-align: top;" width="25%">LoanAmt</th>
<th style="vertical-align: top;" width="25%">Term</th>
<th style="vertical-align: top;" width="25%">Rate</th>
</tr>
<tr>
<td style="vertical-align: top;"> L01 </td>
<td style="vertical-align: top;">100000 </td>
<td style="vertical-align: top;">5 </td>
<td style="vertical-align: top;">4.75 </td>
</tr>
<tr>
<td style="vertical-align: top;"> L02 </td>
<td style="vertical-align: top;">20000 </td>
<td style="vertical-align: top;">2 </td>
<td style="vertical-align: top;">5 </td>
</tr>
<tr>
<td style="vertical-align: top;"> L03 </td>
<td style="vertical-align: top;">500000 </td>
<td style="vertical-align: top;">12 </td>
<td style="vertical-align: top;">4.5 <br />
<br /></td>
</tr>
</tbody>
</table>
The desired report result is as follows:<br /> <img alt="004png" src="http://img.raqsoft.com/file/2019/04/47c7c023686b43fa9b9c10b0008e06e1_004.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-color: transparent; background-image: none;" /><br />
<br />
When calculating loan instalment according to loan amount, loop calculation and cross-row calculation are needed. It is difficult to implement it with stored procedures or scriptlets, but it’s easy to implement in Jasper with the help of esProc. The esProc codes are as follows:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=db.query("select * from loan") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A1.derive(Rate/100/12:mRate,LoanAmt*mRate*power((1+mRate),Term)/(power((1+mRate),Term)-1):mPayment) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A2.((t=LoanAmt,Term.new(A2.LoanID:LoanID, A2.LoanAmt:LoanAmt, A2.mPayment:payment, A2.Term:Term,A2.Rate:Rate, t*A2.mRate:interest, payment-interest:principal, t=t-principal:principlebalance))) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">4 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A3.conj() </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">5 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">return A4 </td>
</tr>
</tbody>
</table>
A1:Execute SQL, extract the records from <em>loan</em>.<br />A2:Add two columns to table in A1, monthly interest rate mRate and monthly<br />
<br />
repayment amount mPayment, respectively. The result is as follows:<br /><img alt="005png" src="http://img.raqsoft.com/file/2019/04/1ce83834f0ea408ebe1942accf7542f7_005.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-color: transparent; background-image: none;" /><br />A3:Calculate the details of each term according to the loan information. A2.()is a loop function, which can calculate the members of A2 in turn. The codes in “()” will be calculated step by step, and finally the result of the last comma will be returned.<br />
<br />
Function new is used to generate new two-dimensional table. The calculation result of A3 is layered data, as follows:<br /><img alt="006png" src="http://img.raqsoft.com/file/2019/04/1cf272bb96fe4741b7c474d8f963e362_006.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-color: transparent; background-image: none;" /><br />A4:Combine the layered data, and form the instalment table.<br />A5:Return the result to the report.<br />
<br />
Similarly, design a simple table in Jasper, and the template is as follows:<br /> <img alt="007png" src="http://img.raqsoft.com/file/2019/04/cc68ffc7eef046a6ab4119a7bf7f1372_007.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-color: transparent; background-image: none;" /><br />
After preview, you can see the result of the report, as we requested.<br />
<br />
<span style="font-size: large;"><b>3. Calculating the growth rate of the cross-table</b></span><br />
The database table <em>store</em> stores the sales volume of various products in 2014 and 2015. Now we need to present the annual sales volume of each product with cross table and calculate the annual growth rate of each product. Part of the source data is as follows:<br />
<br />
<table>
<tbody>
<tr>
<td style="vertical-align: top;">Year item quantity<br />
2014 Book 35<br />
2015 Pencil 50<br />
2014 Pencil 56<br />
2015 Book 67</td>
</tr>
</tbody>
</table>
<br />
The desired report result is as follows:<br /><img alt="008png" src="http://img.raqsoft.com/file/2019/04/fa5753f111684091b0ec0b2228f32823_008.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-color: transparent; background-image: none;" /><br />
<br />
Because each column of the cross table is generated dynamically and needs dynamic reference when calculating between columns, it is difficult to implement this requirement with Jasper script, while it is much simpler to implement the corresponding calculation with esProc in the data preparation stage. The esProc codes are as follows:<br />
<table>
<tbody>
<tr>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="10%"></th>
<th style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;" width="90%">A </th>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">1 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=mydb.query("select * from store order by item,year") </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">2 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">=A1.group(item).run(A1.record(["Growth Rate",item,~(2).quantity/~(1).quantity-1])) </td>
</tr>
<tr>
<td style="background-color: rgb(230 , 230 , 230); border: 1px solid rgb(212 , 212 , 212); font-size: 16px; text-align: center; vertical-align: top;">3 </td>
<td style="background-color: rgb(255 , 255 , 255); border: 1px solid rgb(212 , 212 , 212); vertical-align: top;">return A1 </td>
</tr>
</tbody>
</table>
A1:Query the records of table <em>store</em>.<br />A2:Add annual growth rate of each product. Group according to the items. Run calculates each group of data in turn. Record adds a record, and ~(i) represents the number i record in the current group.<br />A3:Return the calculation result to the report.<br />
<br />
Design the simple cross table in Jasper, and the template is as follows:<br /><img alt="009png" src="http://img.raqsoft.com/file/2019/04/131425405c5342aab2f3a233f0946234_009.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-image: none;" /><br />
<br />
After preview we can see the report result as follows:<br />
<img alt="010png" src="http://img.raqsoft.com/file/2019/04/14858bdc57ea450386cc32cf03090a80_010.png?imageView2/2/w/768/format/jpg/interlace/0/q" style="background-color: transparent; background-image: none;" /></div>
Huocxhttp://www.blogger.com/profile/02976232401731847120noreply@blogger.com0tag:blogger.com,1999:blog-5773662941385236123.post-79306688501310916422019-05-09T00:07:00.001-07:002019-05-13T20:30:51.593-07:00How to Call an esProc Script in JasperReportesProc provides its own JDBC driver to become integration-friendly with a reporting tool. Here we take the development environment of JasperReport5.6.0 as an example to explain how to call SPL in JasperReport.<br />
<br />
<h1 id="toc_h1_0" style="border-bottom: 1px solid rgb(238, 238, 238); font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; line-height: 1.25; margin: 24px 0px 16px; padding-bottom: 0.3em;">
<span style="font-size: large;">Integrating esProc JDBC</span></h1>
<div>
Put simply, to integrate esProc JDBC with JasperReport’s iReport designer is to put the necessary jars and configuration files for loading esProc JDBC in JasperReport’s class path. esProc JDBC requires JDK 1.6 or a higher version.<br />
<h2 id="toc_h2_1">
<span style="font-size: small;">1. Create the configuration file</span></h2>
Create the necessary configuration file <em>raqsoftConfig.xml</em>, which is located in [installation directory]\esProc\config. Its name must not be changed.<br />
The <em>raqsoftConfig.xml</em> file contains license information, esProc main path, dfx file’s search path, and etc. The following shows the basic configuration, i.e. the configuration of esProc license file.<br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><?xml version="1.0" encoding=" UTF-8"?></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i>< Config Version="2"></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <Runtime></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><span style="white-space: pre;"> </span><Esproc></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><span style="white-space: pre;"> </span> <!--The license file can be either an absolute path or a relative path; the latter is relative to the class path --><span style="white-space: pre;"> </span></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <license>esproc.xml</license></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><span style="white-space: pre;"> </span> <!-- Download the Trial License from Raqsoft website --><span style="white-space: pre;"> </span></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> </Esproc></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> </Runtime></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i></Config></i></span><br />
<h2 id="toc_h2_2">
<span style="font-size: small;">2. Load driver jars</span></h2>
esProc JDBC is like a database JDBC driver without physical tables. It can be regarded simply as a database that only supports the stored procedure. It is a stand-alone computing engine that can perform all calculations independently. A database’s JDBC, however, functions only as an interface and an extra database server is needed to perform calculations.<br />
esProc JDBC has three basic jars, which are all situated in [installation directory]\esProc\lib:<br />
<span style="font-family: "times" , "times new roman" , serif; font-size: x-small;"><br /></span><span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><span style="white-space: pre;"> </span>dm.jar esProc computing engine and JDBC driver</i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><span style="white-space: pre;"> </span>icu4j_3_4_5.jar<span style="white-space: pre;"> </span> Handle internationalization</i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><span style="white-space: pre;"> </span>jdom.jar<span style="white-space: pre;"> </span> Parse the configuration files</i></span><br />
<span style="font-family: "times" , "times new roman" , serif; font-size: x-small;"><br /></span>Besides, there are jars for achieving specific functionalities:<br />
To use databases as the data sources in esProc JDBC, their driver jars are required.<br />
To read and write an Office file, <em>poi*.jar</em> and <em>xmlbeans.jar</em> are needed.<br />
To use the graphic function in esProc JDBC, jars for SVG-typed image processing are required, including <em>batik*.jar</em>, <em>js.jar</em>, <em>pdf-transcoder.jar</em>, <em>xalan-2.6.0.jar</em>, <em>xercesImpl.jar</em>, <em>xml-apis.jar</em> and <em>xml-apis-ext.jar</em>.<br />
Place the necessary jars and the directory where <em>raqsoftConfig.xml</em> is located (like D:\software2\Jaspersoft\esProc\config) in the class path. You can also put the compressed configuration file into the root directory of any of the necessary jars.<br />
<br />
Click <strong>Tools -> Options</strong> to configure Classpath:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://img.raqsoft.com.cn/e/86d37d4f2ac54048ada0ed0ff5892285.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://img.raqsoft.com.cn/e/86d37d4f2ac54048ada0ed0ff5892285.png" data-original-height="365" data-original-width="800" height="291" width="640" /></a></div>
<h1 id="toc_h1_3">
<span style="font-size: large;">Call SPL from JasperReport</span></h1>
Here is the process of calling SPL in JasperReport. esProc JDBC is the data source over which SQL-like SPL queries are executed and return a result set. Then the reporting tool calls the result set to build a report.<br />
<h2 id="toc_h2_4">
<span style="font-size: small;">Create a data source</span></h2>
On the Datasource window, add the data source <strong>esproc</strong>, select <strong>com.esproc.jdbc.InternalDriver </strong>under JDBC Driver, type <strong>jdbc:esproc:local:// </strong>under JDBC URL, and leave both Username and Password blank.<br />
<br />
<img src="http://img.raqsoft.com.cn/e/fed0b69c2fb64d3c96fb5ba65f326b63.png" style="background-image: none;" /><br />
esProc is a stand-alone embedded computing engine that can perform all calculations independently. Its URL is local. As it isn’t a real database, it doesn’t need user name and password.<br />
Click Test button and, if the prompt shows <em>Connection test successful!</em>, the data source is connected. Then Click Save to finish the data source creation.<br />
<h2 id="toc_h2_5">
<span style="font-size: small;">Build a report</span></h2>
Let’s look at how JasperReport executes different types of SPL query to build a report.<br />
<h3 id="toc_h3_6">
<span style="font-size: small;">Execute SPL queries</span></h3>
Create a data table with two fields – <em>baseNum</em> and <em>square2</em>, insert 100 records made up of natural numbers less than and equal to 100 and their squares into it, and return the table as result set. The calculation can be expressed in SPL this way: =100.new(~:baseNum,~*~:square2).<br />
<br />
Create a new report, use the esproc data source, and set a query:<br />
<img src="http://img.raqsoft.com.cn/e/5bd528e8568b42ad8fd1e4d7725b2c7e.png" height="417" width="640" /><br />
Click Next to select all fields:<br />
<img src="http://img.raqsoft.com.cn/e/9958adf3944f493fa36868441571dfe7.png" style="background-image: none;" /><br />
Click Next until you get to the Finish button.<br />
<br />
<strong>Report editing:</strong><br />
<br />
Drag all selected fields to the report template’s detailed data area to edit:<br />
<img src="http://img.raqsoft.com.cn/e/841eef7006474f0b84482670838ae2db.png" height="368" style="background-image: none;" width="640" /><br />
<br />
<strong>Report preview:</strong><br />
<img src="http://img.raqsoft.com.cn/e/e81c8f4b2f964253ac1a3667d7cd7c2c.png" height="451" style="background-image: none;" width="640" /><br />
<h3 id="toc_h3_7">
<span style="font-size: small;">Access a local file from SPL</span></h3>
You can access a local file from SPL. esProc supports multiple file types, such as TXT, Excel, JSON, CSV and CTX. Both absolute path and relative path can be used to find a file. A relative path is relative to the main directory set in the configuration file <em>raqsoftConfig.xml</em>. First, let’s look at how to configure the main directory.<br />
<br />
Add the following node under <Esproc></ Esproc > in <em>raqsoftConfig.xml</em>:<br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: x-small;"><i> <!-- esProc main directory, which is an absolute path --></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: x-small;"><i> <mainPath> D:\software2\Jaspersoft\esProc </mainPath></i></span><br />
<br />
Put a to-be-called file, like <em>employee.txt</em>, into the main directory. Code for creating a new report and connecting data source is the same as those explained in the above. Here the query is: =file("employee.txt").import@t().<br />
<img alt="1png" src="http://img.raqsoft.com/file/2018/12/0704ddb32b62462f8c8261b209260d6b_1.png" height="417" style="background-image: none;" width="640" /><br />
<strong><br /></strong><strong>Report preview:</strong><br />
<img src="http://img.raqsoft.com.cn/e/6c7ba1ec74be4e84bdf5fd36f30eaa0d.png" height="235" style="background-image: none;" width="640" /><br />
<br />
As the calculation is simple, you can also use esProc simple SQL syntax to do it: $()select * from employee.txt.<br />
<img src="http://img.raqsoft.com.cn/e/7541b8dcaab041feb87cf179819e5200.png" style="background-image: none;" /><br />
The symbol $() means accessing a local file system. The two queries get same result.<br />
<h3 id="toc_h3_8">
</h3>
<h3 id="toc_h3_8">
<span style="font-size: small;"><br /></span></h3>
<h3 id="toc_h3_8">
<span style="font-size: small;">Call SPL statements that use parameters</span></h3>
Parameters are an important part of a SQL statement. So are they in SPL statements. To query records in <em>employee.txt</em> according to the condition that salary is within a range of [12000, 20000] and sort them by salary in ascending order.<br />
On the Report query window, we can add two parameters <em>param1</em> and <em>param2</em> and set their data types as integer. Drag the parameters to their appropriate positions in the query. The final query is: $()select * from employee.txt where SALARY > $P{param1} and SALARY<$P{param2} order by SALARY.<br />
<br />
<img src="http://img.raqsoft.com.cn/e/fcb02ea500a0457783bdf2178a5a9a4f.png" height="348" style="background-image: none;" width="640" /><br />
<div style="font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; font-size: 16px; margin-bottom: 16px;">
<strong>Report preview:</strong></div>
<div style="font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; font-size: 16px; margin-bottom: 16px;">
Enter the parameters on Parameter prompt window to preview the report.</div>
<div style="font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; font-size: 16px; margin-bottom: 16px;">
<img src="http://img.raqsoft.com.cn/e/f820023e7203412ba1bed37e54126cd3.png" style="background-image: none; background-position: center center; background-repeat: no-repeat; background-size: cover; border: 0px; font-size: 12px; height: auto; max-width: 100%; overflow: hidden; vertical-align: middle;" /></div>
<div style="font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; font-size: 16px; margin-bottom: 16px;">
<img src="http://img.raqsoft.com.cn/e/4d3e81f415ce4e838449ffefc06e6ccd.png" style="background-image: none; background-position: center center; background-repeat: no-repeat; background-size: cover; border: 0px; font-size: 12px; height: auto; max-width: 100%; overflow: hidden; vertical-align: middle;" /></div>
<div style="font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; font-size: 16px; margin-bottom: 16px;">
Here’s the finished report:</div>
<div style="font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; font-size: 16px; margin-bottom: 16px;">
<img src="http://img.raqsoft.com.cn/e/52215002f77749c18b56ba3f1da7d3a0.png" style="background-image: none; background-position: center center; background-repeat: no-repeat; background-size: cover; border: 0px; font-size: 12px; height: auto; max-width: 100%; overflow: hidden; vertical-align: middle;" /></div>
<h3 id="toc_h3_9">
<span style="font-size: small;">Call SPL statements that connect to data sources</span></h3>
As a computing engine, one of the most important data sources of esProc JDBC is the database. Let’s look at how to call a SPL statement that connects to the database.<br />
<br />
First, put in place corresponding database driver jars; then set data source information in <em>raqsoftConfig.xml</em>. Suppose the data source name used in an SPL statement is <em>demo</em> and the database type is HSQL, then you can configure it like this:<br />
<br />
First, put HSQL database driver jar <em>hsqldb.jar</em> in Classpath;<br />
<img src="http://img.raqsoft.com.cn/e/9b5bcb6ba9604e07aa5a0045664fd1fd.png" height="291" style="background-image: none;" width="640" /><br />
<div style="font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; font-size: 16px; margin-bottom: 16px;">
</div>
Second, set data source information in the node <Runtime></Runtime> in <em>raqsoftConfig.xml</em>.<br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><DBList> </i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><DB name="demo"> <!—data source name--></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" ></property> <!—url connection--> </i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="driver" value="org.hsqldb.jdbcDriver" ></property> <!—database driver--></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="type" value="13" ></property><span style="white-space: pre;"> </span><!—database type--></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="user" value="sa" ></property> <!--username--></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="password" ></property> <!--password--></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="batchSize" value="1000" ></property></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="autoConnect" value="true" ></property><!-- Automatically connect or not. If the value is true, use a SQL statement starting with $ to access the database; if it is false, there will be no automatic connection; establish the connection with connect(db) statement before you can access the database --></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="useSchema" value="false" ></property></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="addTilde" value="false" ></property></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="dbCharset" value="UTF-8" ></property></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="clientCharset" value="UTF-8" ></property></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="needTransContent" value="false" ></property></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="needTransSentence" value="false" ></property></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <property name="caseSentence" value="false" ></property></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> </DB></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i></DBList></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i><br /></i></span>Now we’ll query <em>SALES</em> table from <em>demo</em> in SPL to find records whose SELLERID is 3 and ORDERDATE is from 2014-11-01 to 2014-12-12:<br />
Create a new report and data source as the first instance shows. Then set three parameters – <em>param1</em>, <em>param2</em> and <em>param3</em>, and drag them to their positions in the query. The final query is: $(demo)select * from SALES where SELLERID = $P{param1} and ORDERDATE>$P{param2} and ORDERDATE<$P{param3}.<br />
<br />
<img src="http://img.raqsoft.com.cn/e/4a3c4002978b4158b32a560927265b0a.png" style="background-image: none;" /><br />
<strong><br /></strong><strong>Report preview:</strong><br />
Enter the parameters on Parameter prompt window to preview the report.<br />
<img src="http://img.raqsoft.com.cn/e/3461fa258ded406ea9c6cb5a57f1a2f7.png" style="background-image: none;" /><br />
<img src="http://img.raqsoft.com.cn/e/212db581e0be4e89b8000c2a78fc5965.png" style="background-image: none;" /><br />
<img src="http://img.raqsoft.com.cn/e/3167a611b20e4b9ba5860662685ec72b.png" style="background-image: none;" /><br />
Here’s the finished report:<br />
<br />
<img src="http://img.raqsoft.com.cn/e/f76bd8cbe9b14183ba19b4df1cd758af.png" height="309" style="background-image: none;" width="640" /><br />
<h3 id="toc_h3_10">
<span style="font-size: small;">Execute SPL script</span></h3>
By integrating esProc JDBC, JasperReport can call and execute a single SPL statement as well as the complicated SPL script (whose extension is <em>dfx</em>).<br />
A <em>dfx</em> file:<br />
<br />
<table><tbody>
<tr class="firstRow"><td style="background-color: #e6e6e6; border: 1px solid rgb(212, 212, 212); font-size: 16px; text-align: center; vertical-align: top;" width="29"><br /></td><td style="background-color: #e6e6e6; border: 1px solid rgb(212, 212, 212); font-size: 16px; text-align: center; vertical-align: top;" width="175">A</td><td style="background-color: #e6e6e6; border: 1px solid rgb(212, 212, 212); font-size: 16px; text-align: center; vertical-align: top;">B</td><td style="background-color: #e6e6e6; border: 1px solid rgb(212, 212, 212); font-size: 16px; text-align: center; vertical-align: top;">C</td></tr>
<tr><td style="background-color: #e6e6e6; border: 1px solid rgb(212, 212, 212); font-size: 16px; text-align: center; vertical-align: top;" width="29">1</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;" width="175">=demo.query("select NAME as CITY, STATEID as STATE from CITIES")</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;">[]</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;"><br /></td></tr>
<tr><td style="background-color: #e6e6e6; border: 1px solid rgb(212, 212, 212); font-size: 16px; text-align: center; vertical-align: top;" width="29">2</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;" width="175">for A1</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;">=demo.query("select * from STATES where STATEID=?",A2.STATE)</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;"><br /></td></tr>
<tr><td style="background-color: #e6e6e6; border: 1px solid rgb(212, 212, 212); font-size: 16px; text-align: center; vertical-align: top;" width="29">3</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;" width="175"><br /></td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;">if left(B2.ABBR,1)==arg1</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;">>A2.STATE=B2.NAME</td></tr>
<tr><td style="background-color: #e6e6e6; border: 1px solid rgb(212, 212, 212); font-size: 16px; text-align: center; vertical-align: top;" width="29">4</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;" width="175"><br /></td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;"><br /></td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;">>B1=B1|A2</td></tr>
<tr><td style="background-color: #e6e6e6; border: 1px solid rgb(212, 212, 212); font-size: 16px; text-align: center; vertical-align: top;" width="29">5</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;" width="175">return B1</td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;"><br /></td><td style="background-color: white; border: 1px solid rgb(212, 212, 212); vertical-align: top;"><br /></td></tr>
</tbody></table>
<strong><br /></strong><strong>Explanation:</strong><br />
There are two tables – CITIES and STATES. Traverse records in CITIES and find corresponding STATES record by CITIES. STATES, during which if the first letter of STATES.ABBR is equal to parameter <em>arg1</em>, then assign STATES.NAME to CITIES.STATE, and add this record in CITIES to B1. The final result set returned is B1’s value.<br />
The above cellset file receives data from the data source <em>demo</em> and uses parameter <em>arg1</em>:<br />
<img src="http://img.raqsoft.com.cn/e/2ccfa936f52f4fe98885f67925ebc024.png" style="background-image: none;" /><br />
<br />
See the above instances for the data source configuration. The cellset file is saved as <em>city.dfx</em>. A <em>dfx</em> file can be saved in the main directory set in <em>raqsoftConfig.xml</em>. If there are many <em>dfx</em> files, we can put them in the <em>dfx</em>’s search path for easy management and maintenance. Below is how to configure a search path:<br />
Add the following content under <Esproc> <\Esproc> in <em>raqsoftConfig.xml</em>:<br />
<span style="font-family: "times" , "times new roman" , serif; font-size: xx-small;"><span style="font-family: "times" , "times new roman" , serif; font-size: x-small;"> </span><i><span style="font-family: "arial" , "helvetica" , sans-serif;"> <dfxPathList></span></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <dfxPath>D:\software2\Jaspersoft\esProc\dfx</dfxPath></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> </dfxPathList></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: xx-small;"><i> <!--Configure dfx file’s search path, which is an absolute path; multiple paths are allowed and separated by the semicolon --></i></span><br />
Create a new report and data source as the previous instances show. Then create the parameter <em>param1</em>and set its data type as text, and drag it to its position in the query. The final query is: call city($P{param1})。<br />
<br />
<img src="http://img.raqsoft.com.cn/e/930b7cd853b2409098f7719599ced681.png" style="background-image: none;" /><br />
<strong>Report preview:</strong><br />
Enter the parameter on Parameter prompt window to preview the report.<br />
<img src="http://img.raqsoft.com.cn/e/1ac4c999c1c043219173eb54564ab889.png" style="background-image: none;" /><br />
Here’s the finished report:<br />
<img src="http://img.raqsoft.com.cn/e/d421ffba8c5c42f780aed2e7e1ce777c.png" height="312" style="background-image: none;" width="640" /><br />
<br />
We can also use <em>dfx(…) </em>directly without the <em>call</em> when calling a <em>dfx</em> file in JasperReport. In this case, the query is: city $P{param1}.<br />
<img src="http://img.raqsoft.com.cn/uploads/1206/1544075431000641e.png" style="background-image: none;" /><br />
<br />
Enter the parameter to preview the report. The query result will be the same.<br />
<br /></div>
Jerryhttp://www.blogger.com/profile/08883279980468748132noreply@blogger.com0