SQL。如何分隔字符串结尾并获取总和值

时间:2015-08-03 08:28:46

标签: sql sql-server database

我有两个数据库。一个用于Navision,另一个用于WMS。我需要获得成品/计划物品的百分比。问题是这些DB没有密钥。我正在尝试使用相同的值列连接数据库表(例如:Prod_ Order_No (PK, varchar(20), not null)production_order_no(varchar(255,null)

无论如何,我只从一个DB获得了值。第二个DB值几乎总是NULL。 但事实并非如此......

有我的SQL查询代码:

SELECT      i.[code], i.[description],
            p.[quantity],
            uom.code [uom],
            uom.[quantity_per_base_unit_of_measure] [uom_qty],
            p.[quantity]*uom.[quantity_per_base_unit_of_measure]  total,
            wc.code,
            pol."Finished Qty_ (Base)", 
            p.[date_created]
FROM [TWMS].[dbo].[package] p


LEFT JOIN [TWMS].[dbo].[item] i                     ON p.[item_id]          =   i.id
LEFT JOIN [TWMS].[dbo].[item_unit_of_measure] uom       ON p.[uom_id]           =   uom.id 
LEFT JOIN [TWMS].[dbo].[work_center] wc             on p.[work_center_id]   =   wc.id
FULL JOIN [Artilux].[dbo].[Trivilita UAB$Prod_ Order Line] pol on p.[id] = pol.[Line No_] 
WHERE  p.[date_created] >= '2015-07-31' 
AND p.[date_created] <= '2015-08-01' 
AND wc.[code] = 'SF01'
AND wc.[code] not like '%/%'
ORDER BY p.[date_created]

这就是我得到的:

SOF01004/1  SOFA HAVANA OC+H+2,5+D (left)Joise Beige/Brown  1.00    VNT 1.00    1.0000  SF01    NULL    2015-07-31 06:00:03.863
SOF01004/1  SOFA HAVANA OC+H+2,5+D (left)Joise Beige/Brown  1.00    VNT 1.00    1.0000  SF01    NULL    2015-07-31 06:00:48.673
SOF01004/1  SOFA HAVANA OC+H+2,5+D (left)Joise Beige/Brown  1.00    VNT 1.00    1.0000  SF01    NULL    2015-07-31 06:05:08.070
SOF01004/3  SOFA HAVANA OC+H+2,5+D (left)Joise Beige/Brown  1.00    VNT 1.00    1.0000  SF01    NULL    2015-07-31 06:09:11.440
SOF01004/3  SOFA HAVANA OC+H+2,5+D (left)Joise Beige/Brown  1.00    VNT 1.00    1.0000  SF01    NULL    2015-07-31 06:09:14.653
SOF01004/1  SOFA HAVANA OC+H+2,5+D (left)Joise Beige/Brown  1.00    VNT 1.00    1.0000  SF01    NULL    2015-07-31 06:24:13.927
SOF01004/2  SOFA HAVANA OC+H+2,5+D (left)Joise Beige/Brown  1.00    VNT 1.00    1.0000  SF01    NULL    2015-07-31 06:24:17.810
SOF01004/2  SOFA HAVANA OC+H+2,5+D (left)Joise Beige/Brown  1.00    VNT 1.00    1.0000  SF01    NULL    2015-07-31 06:24:20.890
SOF01004/2  SOFA HAVANA OC+H+2,5+D (left)Joise Beige/Brown  1.00    VNT 1.00    1.0000  SF01    NULL    2015-07-31 06:24:24.093

1问题。八列不应该是NULL ..也许我的连接错了?

2问题。第一列是商品代码,但SOF01004 / 1和SOF01004 / 3等是三件中的1件商品。所以我需要丢弃所有/ 1,/ 2,/ 3并且只获得SOF01004 +数量之和(其中FULL SOF01004项目等于MIN部分。类似于:sum(SOF01004/1) = 3sum(SOF01004/2) = 2sum(SOF01004/3) = 10,因此SOF01004项目的数量应为2.因为有两件来自theese的完整项目。

3问题。我需要获得SUM(pol."(Finished Qty (Base)") / SUM(p.[quantity])) * 100的百分比,但问题是一列是来自一个DB而第二列是来自其他...:/

请向我提供更多信息。我会编辑我的帖子。和我的坏英语课程很抱歉。

1 个答案:

答案 0 :(得分:0)

对于问题2:

如果某件商品的数量(例如SOF01004 / 1)为0,那么包装中是否还有一行还是可以完全丢失?

如果它总是存在,我会做这样的事情:

select 
    case when POS > 0 then left(code, POS-1) else code end as code,
    description,
    min(quantity) 
from (
    SELECT
        i.code, 
        patindex('%/[0-9]', i.code) as POS,
        i.description,
        sum(p.quantity),
    ...
    group by i.code, i.description ...
) X
group by
    case when POS > 0 then left(code, POS-1) else code end as code,
    description,
    ....

这里patindex假设结尾总是/ + 1个数字。如果它可以是更多数字,添加更多patindex字段可能是最佳选择。如果代码本身没有/,使用charindex也可以。

如果数据库中的行完全丢失,应该被视为零,那么我会创建一个如下所示的表:

SOF01004/1    SOF01004
SOF01004/2    SOF01004
SOF01004/3    SOF01004

然后你可以使用这个表来获取和外部连接包表来获得更短的代码,并使用isnull(数量,0)来获取缺失的数量。