es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Seleccionando el nombre del primer registro de valores duplicados.

Estoy escribiendo una consulta en la que quiero seleccionar el Número de parte, Descripción, Modelo y Cantidad disponible de una vista.

Pero en nuestro sistema, hay Descripciones o Modelos ligeramente diferentes para el mismo número de parte.

Como ejemplo, la Parte A tiene una descripción como Esta es la Parte A y también hay otro registro con una descripción como Esta es la Parte Aa

En mi consulta, quiero eliminar los duplicados y sumar la Cantidad disponible y mostrarla. Pero debido a las descripciones y modelos diferentes para los mismos números de parte, obtengo más valores duplicados en el informe final.

Este es mi código actual.

SELECT DISTINCT PART_NO as PartNo, 
ad.INVENTORY_PART_API.Get_Description(CONTRATO, NUMERO_PARTE) as DescripcionParte,
ad.Inventory_Product_Family_API.Get_Description(ad.Inventory_Part_API.Get_Part_Product_Family(CONTRATO, NUMERO_PARTE)) as ModeloParte,
SUM( CANTIDAD_DISPONIBLE - CANTIDAD_RESERVADA) as CantidadDisponible 
FROM ad.INVENTORY_PART_IN_STOCK_UIV 
WHERE CONTRATO is not null and 
upper(ad.Sales_Part_API.Get_Catalog_Group(CONTRATO, NUMERO_PARTE)) = upper('SPAM')OR 
upper(ad.Sales_Part_API.Get_Catalog_Group(CONTRATO, NUMERO_PARTE)) = upper('OTOA') 
GROUP BY NUMERO_PARTE,
ad.INVENTORY_PART_API.Get_Description(CONTRATO, NUMERO_PARTE),
ad.Inventory_Product_Family_API.Get_Description(ad.Inventory_Part_API.Get_Part_Product_Family(CONTRATO, NUMERO_PARTE))

Obtengo 14623 registros, 46 registros están duplicados debido a que la descripción o el modelo eran diferentes entre sí. ¿Hay alguna manera de obtener esto sin duplicados?

Intenté seleccionar solo el Número de parte y la Cantidad. Luego, los registros vienen sin duplicados. Quiero saber si hay alguna manera de seleccionar el Número de parte y luego asignar descripción y modelo a partir del primer registro duplicado o algo así y la suma de la cantidad. Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de seleccionar PartNo y luego asignar la descripción y el modelo a los valores duplicados del primer registro y luego sumar la cantidad. Puedes usar la función analítica ROW_NUMBER() para asignar un número de fila a cada registro particionado por PartNo, ordenado por la columna que tenga prioridad. Por ejemplo, si la prioridad es seleccionar la primera descripción alfabéticamente, la consulta se vería así:

    SELECT PART_NO AS PartNo,
           MAX(CASE WHEN rnk = 1 THEN PART_DESCRIPTION END) AS PartDescription,
           MAX(CASE WHEN rnk = 1 THEN PART_MODEL END) AS PartModel,
           SUM(AVAQTY) AS AvaQty
    FROM (
      SELECT PART_NO,
             ad.INVENTORY_PART_API.Get_Description(CONTRACT, PART_NO) AS PART_DESCRIPTION,
             ad.Inventory_Product_Family_API.Get_Description(ad.Inventory_Part_API.Get_Part_Product_Family(CONTRACT, PART_NO)) AS PART_MODEL,
             SUM(QTY_ONHAND - QTY_RESERVED) AS AvaQty,
             ROW_NUMBER() OVER (PARTITION BY PART_NO 
                                ORDER BY ad.INVENTORY_PART_API.Get_Description(CONTRACT, PART_NO) ASC) as rnk
      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))
    )
    GROUP BY PART_NO;
    

    En la consulta interna, utilizamos la función analítica ROW_NUMBER() para asignar un rango a cada registro particionado por PartNo y ordenado alfabéticamente por descripción. Luego, en la consulta externa, utilizamos la función MAX() para seleccionar la descripción y el modelo pertenecientes al primer registro clasificado y la función SUM() para calcular la cantidad total. Finalmente, hacemos un GROUP BY por PartNo para obtener el resultado deseado.

Comments are closed.