0

我有一张桌子,里面放着物品的计量单位,它的数量看起来像这样

| ItemID |  Qty  |  UOM  |  Factor  | Level |
+--------+-------+-------+----------+-------+
|   9    |   0   |   ctn |    48    |   1   |
|   9    |   1   |   Can |    380   |   2   |
|   9    |   0   |   ML  |    1     |   3   |

这意味着项目编号 9 UOM 是

1ctn = 48can

1罐 = 380ML

此商品还有 1can(qty)

我想通过使用 T-Sql 选择脚本将 1can 转换为 ctn 或 ML。

请帮我 !谢谢!

4

2 回答 2

1

如果您有未知数量的级别,您可以使用递归公用表表达式来遍历所有可能的级别:

WITH CTE AS
(   SELECT  t1.ItemID, 
            UnitFrom = t1.UOM, 
            UnitTo = t2.UOM, 
            Factor = CAST(t2.Factor AS DECIMAL(15, 2)), 
            NextLevelFactor = t1.Factor,
            t1.Level
    FROM    T t1
            INNER JOIN T t2
                ON t2.ItemID = t1.ItemID
                AND t2.Level + 1 = t1.Level
    UNION ALL
    SELECT  t1.ItemID, 
            UnitFrom = t2.UOM, 
            UnitTo = t1.UnitTo, 
            Factor = CAST(t1.Factor * t1.NextLevelFactor AS DECIMAL(15, 2)),
            NextLevelFactor = t2.Factor,
            t2.Level
    FROM    CTE t1
            INNER JOIN T t2
                ON t2.ItemID = t1.ItemID
                AND t2.Level = t1.Level + 1
)
SELECT  ItemID,
        UnitFrom,
        UnitTo,
        Factor
FROM    CTE;

其结果是一个转换表:

ItemID  UnitFrom    UnitTo  Factor
9       Can         ctn     48
9       ML          Can     380
9       ML          ctn     18240

然后您可以加入您的主表以获取所有级别之间的转换因子。

SQL Fiddle 示例

于 2013-10-18T10:29:31.527 回答
0

尝试这个:

select 
    t1.itemid, t1.uom, t1.level,
    isnull(nullif(1.0*t2.qty,0)/t1.factor,0) as  qty_calc
from table t1
join table t2
    on  t1.itemid=t2.itemid
    and t1.Level+1=t2.Level

在这种情况下,这是用于计算上层 (ctn)。对于较低级别 (ml),您可以将 join 更改为t1.Level=t2.Level+1,并将计算运算符更改为乘法而不是除法。

于 2013-10-18T09:49:42.927 回答