繁体   English   中英

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

[英]SQL. How to seperate string ending and get sum values

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

无论如何,我只能从一个数据库获得值。 第二个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,/ 2,/ 3并仅获得SOF01004 +数量的总和(其中FULL SOF01004项目等于MIN部分。类似这样的东西:有sum(SOF01004/1) = 3sum(SOF01004/2) = 2sum(SOF01004/3) = 10 ,因此项目SOF01004的计数应为2。因为这些零件中有2个完整项目。

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

向我询问更多信息。 我将编辑我的帖子。 抱歉,我的英语不好。

对于问题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

然后,您可以使用该表进行获取,并使用此表将其外部连接到包装表中以获取较短的代码,并使用isull(quantity,0)来获取缺失的数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM