Как получить различные значения после добавления значений нескольких узлов в XQuery?

Ниже xml:

<mo>
    <customers>
    <customer cno="2222">
            <cname>Charles</cname>
            <street>123 Main St.</street>
            <city>Wichita</city>
            <zip>67226</zip>
            <phone>316-636-5555</phone>
        </customer>
        <customer cno="1000">
            <cname>Bismita</cname>
            <street>Ashford Dunwoody</street>
            <city>Wichita</city>
            <zip>67226-1555</zip>
            <phone>000-000-0000</phone>
        </customer>     
    </customers>

    <employees>
    <employee eno="1000">
            <ename>Jones</ename>
            <city>Wichita</city>
            <zip>67226-1555</zip>
            <hdate>1995-12-12</hdate>
        </employee>
        <employee eno="2000">
            <ename>Asmit</ename>
            <city>Wichita</city>
            <zip>67226-1555</zip>
            <hdate>1967-08-13</hdate>
        </employee>
        <employee eno="1003">
            <ename>Axaya</ename>
            <city>BBSR</city>
            <zip>67226</zip>
            <hdate>1978-08-13</hdate>
        </employee>     
    </employees>


    <parts>
        <part pno="10506">          
            <pname>Land Before Time I</pname>
            <qoh>200</qoh>
            <price>319.99</price>
            <level>20</level>
        </part>
        <part pno="10000">          
            <pname>Bottle</pname>
            <qoh>2</qoh>
            <price>3.00</price>
            <level>2</level>
        </part>
        <part pno="10508">          
            <pname>Land Before Time 3</pname>
            <qoh>202</qoh>
            <price>2.00</price>
            <level>22</level>
        </part>
        <part pno="10509">          
            <pname>Cycle</pname>
            <qoh>202</qoh>
            <price>1.00</price>
            <level>22</level>
        </part>
    </parts>

    <orders>    
        <order ono="1000" takenBy="1000" customer="2222" >
            <receivedDate>1967-08-17</receivedDate>
            <shippedDate>1967-08-13</shippedDate>
            <items>
                <item>
                    <partNumber>10508</partNumber>
                    <quantity>2</quantity>
                </item>
            </items>
        </order>
        <order ono="1001" takenBy="1000" customer="1000" >
            <receivedDate>1968-08-14</receivedDate>
            <shippedDate>1968-08-11</shippedDate>
            <items>
                <item>
                    <partNumber>10000</partNumber>
                    <quantity>2</quantity>
                </item>

            </items>
        </order>

        <order ono="1022" takenBy="1003"  customer="2222" >
            <receivedDate>1995-02-14</receivedDate>
            <shippedDate>1995-02-13</shippedDate>
            <items>
                <item>
                    <partNumber>10000</partNumber>
                    <quantity>1</quantity>
                </item>
                <item>
                    <partNumber>10508</partNumber>
                    <quantity>2</quantity>
                </item>
                <item>
                    <partNumber>10509</partNumber>
                    <quantity>3</quantity>
                </item>
            </items>
        </order>

    </orders>
</mo>

Как получить номер заказа и их общую стоимость для каждого заказа? Я пробовал ниже xquery:

for
$o in /mo/orders/order,
$p in /mo/parts/part
where
$o/items/item/partNumber = data($p/@pno) 
return concat(data($o/@ono),'-', sum($p/price))

Он возвращает номер заказа с общей ценой, разделенной знаком «-», но возвращает дубликаты из-за нескольких элементов в заказе. текущий результат:

1000-2 1001-3 1022-3 1022-2 1022-1

ожидаемый результат:

1000-2 1001-3 1022-6

Любая помощь, чтобы получить различные значения номера заказа с общей ценой???


person Itz.Irshad    schedule 21.04.2013    source источник
comment
Почему вы добавили сюда тег C#? Я не вижу ничего, связанного с C#   -  person Daniel Hilgarth    schedule 21.04.2013
comment
Вы опять забыли умножить на количество купленных вещей.   -  person Jens Erat    schedule 21.04.2013


Ответы (1)


Используйте расчет цены, который я предложил в другом вашем вопросе, и запускайте его для каждого заказа. Проблема в обоих вопросах одинакова: fn:sum() ставится не в ту позицию.

for $order in /mo/orders/order
return concat
  (
    $order/@ono,
    '-',
    fn:sum(
      for $item in $order/items/item
      return /mo/parts/part[@pno = $item/partNumber]/price * $item/quantity
    )
  )
person Jens Erat    schedule 21.04.2013
comment
Еще раз спасибо. И еще: для получения номеров сотрудников и их общей продажи. Я пишу запрос: для $e в /mo/employees/employee, $o в /mo/orders/order, где data($e/@eno) = data($o/@takenBy) return concat(data($e /@eno),'-', count($o/@ono)) - person Itz.Irshad; 21.04.2013
comment
это тот же случай, что и в заказах. Можете ли вы дать мне идеальный запрос для этого тоже. Спасибо - person Itz.Irshad; 21.04.2013
comment
Это точно такая же проблема, как и в этом вопросе, вам не нужно ничего делать, кроме как обмениваться некоторыми выражениями XPath (и именами переменных, если хотите). Я почти уверен, что вы можете сделать это сами, вам лучше сделать домашнюю работу самостоятельно. - person Jens Erat; 21.04.2013
comment
Я пытаюсь, но запутался с последним оператором возврата. Не могли бы вы его сформулировать. - person Itz.Irshad; 21.04.2013
comment
Все ваши вопросы/запросы имеют одну и ту же проблему. Здесь вам нужно будет применить счетчик для каждого сотрудника, поэтому сделайте что-то вроде $employee в ... return count (для $employee, совпадающего с количеством возвращаемых элементов $order). Приложите еще немного усилий для понимания проблемы (особенно разницы между запросами, которые вы пишете, и моими), и я буду рад вам помочь, прямо сейчас кажется, что я делаю вашу домашнюю работу. - person Jens Erat; 21.04.2013