[英]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) = 3
, sum(SOF01004/2) = 2
, sum(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.