Как вывести значения из 2 разных групп в одну строку? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть файл сотрудников, которые получают разные виды заработка за период оплаты.У каждого сотрудника может быть от 1 до 3 различных типов флагов заработка (A, B, C), и эти доходы могут приходиться на разные даты.

Для каждого сотрудника я хотел бы суммировать суммы вместе, если запись имееттот же флаг заработка и дата.Если нет, скажем, заработка B, то в месте B должно быть 0.

Я бы хотел, чтобы выходные данные были в одной строке, если это возможно, чтобы сделать читабельность и проверку проще.Это часть, с которой у меня проблемы.

Я сгруппирован по EmployeeID, EarningFlag и Date.Затем я суммировал суммы для каждой группировки.Вывод идет по отдельным строкам и является беспорядком.Я понятия не имею, как поставить ноль на место, если в этот день для работника нет такого флага заработка.

Пример XML:

<Entry>
    <EmployeeName>Bob Stevens</EmployeeName>
    <EmployeeID>123</EmployeeID>
    <EarningFlag>A</EarningFlag>
    <Date>2019-04-01</Date>
    <Amount>2031.54</Amount>
</Entry>
<Entry>
    <EmployeeName>Bob Stevens</EmployeeName>
    <EmployeeID>123</EmployeeID>
    <EarningFlag>A</EarningFlag>
    <Date>2019-04-01</Date>
    <Amount>30.74</Amount>
</Entry>
<Entry>
    <EmployeeName>Bob Stevens</EmployeeName>
    <EmployeeID>123</EmployeeID>
    <EarningFlag>B</EarningFlag>
    <Date>2019-04-01</Date>
    <Amount>1.63</Amount>
</Entry>
<Entry>
    <EmployeeName>Samantha Philips</EmployeeName>
    <EmployeeID>036</EmployeeID>
    <EarningFlag>C</EarningFlag>
    <Date>2019-04-01</Date>
    <Amount>631.54</Amount>
</Entry>
<Entry>
    <EmployeeName>Samantha Philips</EmployeeName>
    <EmployeeID>036</EmployeeID>
    <EarningFlag>C</EarningFlag>
    <Date>2019-04-01</Date>
    <Amount>3771.33</Amount>
</Entry>
<Entry>
    <EmployeeName>Samantha Philips</EmployeeName>
    <EmployeeID>036</EmployeeID>
    <EarningFlag>A</EarningFlag>
    <Date>2019-04-01</Date>
    <Amount>631.54</Amount>
</Entry>
<Entry>
    <EmployeeName>Samantha Philips</EmployeeName>
    <EmployeeID>036</EmployeeID>
    <EarningFlag>B</EarningFlag>
    <Date>2019-03-07</Date>
    <Amount>3771.33</Amount>
</Entry>
<xsl:for-each-group select="Entry" group-by="concat(EmployeeID,Date,EarningFlag)">

   <xsl:sort select="current-grouping-key()"/>  

   <xsl:value-of select="EmployeeID"/>
   <xsl:text>,</xsl:text>

   <xsl:value-of select="EmployeeName"/>
   <xsl:text>,</xsl:text>

   <xsl:value-of select="Date"/>
   <xsl:text>,</xsl:text>

   <xsl:if test="EarningFlag='A'">
    <xsl:value-of select="sum(current-group()/Amount)"/>
   </xsl:if>
   <xsl:text>,</xsl:text>
   <xsl:if test="EarningFlag='B'">
    <xsl:value-of select="sum(current-group()/Amount)"/>
   </xsl:if>
   <xsl:text>,</xsl:text>
   <xsl:if test="EarningFlag='C'">
    <xsl:value-of select="sum(current-group()/Amount)"/>
   </xsl:if>

</xsl:for-each-group>

My actual results are:
123,Bob Stevens,2019-04-04,2062.28123,Bob Stevens,2019-04-04,1.63,
036,Samantha Philips,2019-03-07,3771.33,
036,Samantha Philips,2019-04-01,631.54,036,Samantha Philips,2019-04-01,3771.33

The expected output would be in the order of Employee ID, Employee Name, Date, A, B, C.

123,Bob Stevens,2019-04-01,2062.28,1.63,0
036,Samantha Philips,2019-03-07,0,3771.33,0
036,Samantha Philips,2019-04-01,631.54,0,3771.33


Is this even possible???

Thank you for any help.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Исходя из ответа от @ michael.hor257k, вы также можете написать

 <xsl:for-each-group select="Entry" group-by="concat(EmployeeID,Date)">

    <xsl:sort select="EmployeeID"/>  
    <xsl:sort select="Date"/>  

    <xsl:value-of select="EmployeeID, EmployeeName, Date,
                          sum(current-group([EarningFlag='A']/Amount),
                          sum(current-group()[EarningFlag='B']/Amount,
                          sum(current-group()[EarningFlag='C']/Amount"
                  separator=","/>
    <xsl:text>&#10;</xsl:text>

</xsl:for-each-group>
0 голосов
/ 02 апреля 2019

Я думаю, вы хотите сделать:

<xsl:for-each-group select="Entry" group-by="concat(EmployeeID,Date)">

    <xsl:sort select="EmployeeID"/>  
    <xsl:sort select="Date"/>  

    <xsl:value-of select="EmployeeID"/>
    <xsl:text>,</xsl:text>

    <xsl:value-of select="EmployeeName"/>
    <xsl:text>,</xsl:text>

    <xsl:value-of select="Date"/>
    <xsl:text>,</xsl:text>

    <xsl:value-of select="sum(current-group()[EarningFlag='A']/Amount)"/>
    <xsl:text>,</xsl:text>

    <xsl:value-of select="sum(current-group()[EarningFlag='B']/Amount)"/>
    <xsl:text>,</xsl:text>

    <xsl:value-of select="sum(current-group()[EarningFlag='C']/Amount)"/>
    <xsl:text>&#10;</xsl:text>

</xsl:for-each-group>
...