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.

Repite el número de fila con join.

Estoy tratando de obtener el número de fila para cada ID incremental por correo electrónico de cliente.

TABLA DE PEDIDOS DE STAGE_MAGENTO:

CORREO_ELECTRÓNICO_CLIENTE ID_INCREMENTAL ID_ENTIDAD
123@gmail.com 1232 24323
123@gmail.com 1258 25343

TABLA DE LÍNEAS DE PEDIDOS DE STAGE_MAGENTO:

NOMBRE_DEL_PRODUCTO ID_PEDIDO
Apple 24323
Banana 24323
Pear 25343

Resultado deseado (El NÚMERO_DE_PEDIDO es el mismo para cada ID_INCREMENTAL):

| CORREO_ELECTRÓNICO_CLIENTE | ID_INCREMENTAL | ID_ENTIDAD | NOMBRE_DEL_PRODUCTO | NUMERO_DE_PEDIDO |
|---------------------------|----------------|------------|--------------------|-----------------|
| 123@gmail.com             | 1232           | 24323      | Apple              | 1               |
| 123@gmail.com             | 1232           | 24323      | Banana             | 1               |
| 123@gmail.com             | 1258           | 25343      | Pear               | 2               |

Resultado obtenido al intentar lo siguiente (como se puede ver, el NUMERO_DE_PEDIDO ha incrementado cuando no debería):

| CORREO_ELECTRÓNICO_CLIENTE | ID_INCREMENTAL | ID_ENTIDAD | NOMBRE_DEL_PRODUCTO | NUMERO_DE_PEDIDO |
|---------------------------|----------------|------------|--------------------|-----------------|
| 123@gmail.com             | 1232           | 24323      | Apple              | 1               |
| 123@gmail.com             | 1232           | 24323      | Banana             | 2               |
| 123@gmail.com             | 1258           | 25343      | Pear               | 3               |

Código intentado:

SELECT 
    o.CORREO_ELECTRÓNICO_CLIENTE
    , O.ID_INCREMENTAL
    , l.NOMBRE_DEL_PRODUCTO
    , ROW_NUMBER() OVER(PARTITION BY LOWER(o.correo_electrónico_cliente) ORDER BY o.CREACION) AS NUMERO_DE_PEDIDO
    , o.TOTAL_GENERAL_BASE - o.COSTO_ENVIO_BASE - o.TOTAL_IMPUESTOS_BASE AS VENTA_NETA
FROM PEDIDO_MAGENTO_STAGE o
INNER JOIN LINEAPEDIDOS_MAGENTO_STAGE l
ON l.ID_PEDIDO = o.ID_ENTIDAD

¿Realmente necesito cambiarlo para que sea así? (pensé que no era bueno hacer declaraciones SELECT anidadas):

SELECT 
    o.CORREO_ELECTRÓNICO_CLIENTE
    , O.ID_INCREMENTAL
    , l.NOMBRE_DEL_PRODUCTO
    , o.NUMERO_DE_PEDIDO
    , o.TOTAL_GENERAL_BASE - o.COSTO_ENVIO_BASE - o.TOTAL_IMPUESTOS_BASE AS VENTA_NETA
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY LOWER(correo_electrónico_cliente) ORDER BY CREACION) AS NUMERO_DE_PEDIDO FROM PEDIDO_MAGENTO_STAGE) o
INNER JOIN LINEAPEDIDOS_MAGENTO_STAGE l
ON l.ID_PEDIDO = o.ID_ENTIDAD
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado de tener el mismo número de pedido para cada incremento de ID por correo electrónico del cliente, es necesario utilizar una declaración SELECT anidada con la función ROW_NUMBER(). Aquí está la consulta correcta que te dará el resultado deseado:

    SELECT 
        o.CUSTOMER_EMAIL
        , O.INCREMENT_ID
        , l.PRODUCT_NAME
        , o.ORDER_NUMBER
        , o.BASE_GRAND_TOTAL - o.BASE_SHIPPING_AMOUNT - o.BASE_TAX_AMOUNT AS NET_SALE
    FROM (SELECT 
            ENTITY_ID
            , CUSTOMER_EMAIL
            , INCREMENT_ID
            , ROW_NUMBER() OVER(PARTITION BY CUSTOMER_EMAIL, INCREMENT_ID ORDER BY CREATED_AT) AS ORDER_NUMBER
            , BASE_GRAND_TOTAL
            , BASE_SHIPPING_AMOUNT
            , BASE_TAX_AMOUNT
        FROM STAGE_MAGENTO_ORDER) o
    INNER JOIN STAGE_MAGENTO_ORDER_LINEITEM l
    ON l.ORDER_ID = o.ENTITY_ID
    

    Como puedes ver, la declaración SELECT anidada ahora incluye tanto el correo electrónico del cliente como el incremento de ID en la cláusula PARTITION BY de la función ROW_NUMBER(). Esto asegurará que el número de pedido se reinicie para cada combinación única de correo electrónico del cliente e incremento de ID.

    No necesariamente tienes que utilizar declaraciones SELECT anidadas, pero en este caso es el enfoque más adecuado para obtener el resultado deseado.

Comments are closed.