【问题标题】:从重复值中选择第一个记录名称
【发布时间】:2022-01-21 21:02:52
【问题描述】:

我正在编写一个查询,我想选择 PartNoDescriptionModelAvaQty > 从一个视图。

但在我们的系统中,对于相同的部件号,描述型号略有不同。

例如,A 部分有 descriptionThis is Part A 并且还有另一条 description 记录像 This是 Aa 部分

在我的查询中,我想删除重复项并对 Ava 数量求和并显示。但由于相同零件编号的描述和型号不同,我在最终报告中得到了更多重复值。

这是我当前的代码。

SELECT DISTINCT PART_NO as PartNo, 
ad.INVENTORY_PART_API.Get_Description(contract,part_no) as PartDescription,
ad.Inventory_Product_Family_API.Get_Description(ad.Inventory_Part_API.Get_Part_Product_Family(CONTRACT, PART_NO)) as PartModel,
SUM( QTY_ONHAND - QTY_RESERVED) as AvaQty 
FROM ad.INVENTORY_PART_IN_STOCK_UIV 
WHERE CONTRACT is not null and 
upper(ad.Sales_Part_API.Get_Catalog_Group(CONTRACT, PART_NO)) = upper('SPAM')OR 
upper(ad.Sales_Part_API.Get_Catalog_Group(CONTRACT, PART_NO)) = upper('OTOA') 
GROUP BY PART_NO,
ad.INVENTORY_PART_API.Get_Description(contract,part_no),
ad.Inventory_Product_Family_API.Get_Description(ad.Inventory_Part_API.Get_Part_Product_Family(CONTRACT, PART_NO))

所以我得到了 14623 条记录,其中 46 条记录重复,因为描述或模型彼此不同。那么有什么方法可以在不复制的情况下获得它?

我试过没有选择描述和型号。仅选择 PartNo 和 Qty。然后记录没有重复记录。需要知道是否有任何方法可以选择 PartNo,然后从重复值第一个记录或某事和数量的总和中分配描述和模型。谢谢

【问题讨论】:

  • 顺便说一下,这是 Oracle SQL,而不是编程语言 PL/SQL。

标签: sql oracle greatest-n-per-group


【解决方案1】:

我会使用分析函数来解决这个任务。 例如,SUM(qty_onhand - qty_reserved) OVER (PARTITION BY PART_NO)。在这种情况下,您不必使用GROUP BY

【讨论】:

    【解决方案2】:

    您希望每个零件号有一个结果行,因此按零件号分组。每个零件编号可能有不同的描述,因此请决定显示哪个。下面,我展示了字母表中的第一个 (MIN)。您也可以使用MAX 显示最新的或使用LISTAGG 显示全部。

    SELECT
      part_no AS partno, 
      MIN(ad.inventory_part_api.get_description(contract,part_no)) AS partdescription,
      MIN(ad.inventory_product_family_api.get_description(ad.inventory_part_api.get_part_product_family(contract, part_no))) AS partmodel,
      SUM(qty_onhand - qty_reserved) AS avaqty 
    FROM ad.inventory_part_in_stock_uiv 
    WHERE contract IS NOT NULL 
    AND UPPER(ad.sales_part_api.get_catalog_group(contract, part_no)) IN ('SPAM', 'OTOA')
    GROUP BY part_no
    ORDER BY part_no;
    

    关于你的WHERE 子句:你有WHERE (contract IS NOT NULL AND catgrp = 'SPAM') OR (catgrp = 'OTOA'),因为AND 优先于OR。在我的查询中是WHERE (contract IS NOT NULL) AND (catgrp = 'SPAM' OR catgrp = 'OTOA')。我想这就是你真正想要的。否则改回来。

    【讨论】:

      猜你喜欢
      • 2012-04-23
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多