2014-04-03 46 views
1

我想通过区域的名称获取区域的名称,产品的数量和产品的最小库存订单的面额。XQuery中的min()函数

我几乎得到了除了不打印任何东西的面额外。

我的代码:

for $zone in distinct-values(/productos/produc/cod_zona) 
let $numero := count(/productos/produc[cod_zona = $zone]/cod_prod) 
let $nomzona:=/zonas/zona[cod_zona = $zone]/nombre 
let $minimo :=min(/productos/produc[cod_zona = $zone]/stock_minimo) 
let $deno :=/productos/produc[stock_minimo=$minimo]/denominacion 
order by $nomzona ascending 
return concat('Zona:', $nomzona,' ', 
       'Productes:', $numero,' ', 
       'Mínim stock:', $deno 

结果:

Zona:Andalucía Productes:2 Mínim stock: //here must be print like that "Placa base " 
Zona:Extremadura-Galicia Productes:3 Mínim stock: 
Zona:Levante-Cataluña Productes:4 Mínim stock: 
Zona:Madrid-CENTRO Productes:4 Mínim stock: 

productos.xml:

<productos> 
<TITULO>DATOS DE LA TABLA PRODUCTOS</TITULO> 
<produc> 
    <cod_prod>1010</cod_prod> 
    <denominacion>Placa Base MSI G41M-P26</denominacion> 
    <precio>50</precio> 
    <stock_actual>10</stock_actual> 
    <stock_minimo>3</stock_minimo> 
    <cod_zona>10</cod_zona> 
</produc> 
<produc> 
    <cod_prod>1011</cod_prod> 
    <denominacion>Micro Intel Core i5-2320</denominacion> 
    <precio>120</precio> 
    <stock_actual>3</stock_actual> 
    <stock_minimo>5</stock_minimo> 
    <cod_zona>10</cod_zona> 
</produc> 
<produc> 
    <cod_prod>1012</cod_prod> 
    <denominacion>Micro Intel Core i5 2500</denominacion> 
    <precio>170</precio> 
    <stock_actual>5</stock_actual> 
    <stock_minimo>6</stock_minimo> 
    <cod_zona>20</cod_zona> 
</produc> 
<produc> 
    <cod_prod>1013</cod_prod> 
    <denominacion>HD Seagate Barracuda 250GB SATA</denominacion> 
    <precio>80</precio> 
    <stock_actual>10</stock_actual> 
    <stock_minimo>5</stock_minimo> 
    <cod_zona>20</cod_zona> 
</produc> 
<produc> 

其它XML: zonas.xml:

<zonas> 
<TITULO>DATOS DE LA TABLA ZONAS</TITULO> 
<zona> 
    <cod_zona>10</cod_zona> 
    <nombre>Madrid-CENTRO</nombre> 
    <director>Pedro Martín</director> 
</zona> 
<zona> 
    <cod_zona>20</cod_zona> 
    <nombre>Extremadura-Galicia</nombre> 
    <director>Alicia Pérez</director> 
</zona> 
<zona> 

我在做什么错?

感谢/格拉西亚斯/留言Merci

回答

3

你是不是限制$deno到当前区域,所以对于produc s的相同stock_minimo,这将返回一个序列而不是单个项目的。所以,你应该先添加另一个谓词区:

let $deno := /productos/produc[cod_zona = $zone][stock_minimo=$minimo]/denominacion 

但是,如果有过2 produc用相同min(stock_minimo)同一区域内,你将有同样的问题,所以你可以制定此计划在您的输出通过使用string-join代替concat

concat('Zona:', $nomzona,' ', 
     'Productes:', $numero,' ', 
     'Mínim stock:', string-join($deno, ', ') ... 
+0

非常感谢您的帮助。优秀的解释。 – user3325719

+0

@ user3325719如果您还有其他问题,请告诉我。如果没有,请接受答案:) – wst