He SQL siguiente tabla:

AR_Customer_ShipTo

+--------------+------------+-------------------+------------+
| ARDivisionNo | CustomerNo |   CustomerName    | ShipToCode |
+--------------+------------+-------------------+------------+
|           00 | 1234567    | Test Customer     |          1 |
|           00 | 1234567    | Test Customer     |          2 |
|           00 | 1234567    | Test Customer     |          3 |
|           00 | ARACODE    | ARACODE Customer  |          1 |
|           00 | ARACODE    | ARACODE Customer  |          2 |
|           01 | CBE1EX     | Normal Customer   |          1 |
|           02 | ZOCDOC     | Normal Customer-2 |          1 |
+--------------+------------+-------------------+------------+

(ARDivisionNo, CustomerNo,ShipToCode) formar una clave primaria de esta tabla.

Si usted note los primeros 3 filas pertenecen a un mismo cliente (Cliente de Prueba), que tiene diferentes ShipToCodes: 1, 2 y 3. Similar es el caso con el segundo cliente (ARACODE Cliente). Cada uno de los Normal al Cliente y Normal por parte del Cliente-2 tiene 1 registros con un solo ShipToCode.

Ahora, me gustaría obtener resultado consultar en esta tabla, en donde voy a tener solo 1 registro por cliente. Así que, para cualquier cliente, donde hay más de 1 registros, me gustaría mantener el registro con el valor más elevado para ShipToCode.

He intentado varias cosas:

(1) que fácilmente se puede obtener la lista de clientes con un solo registro en la tabla.

(2) Con la siguiente consulta, yo soy capaz de obtener la lista de todos los clientes, que tienen más de un registro en la tabla.

[Consulta-1]

SELECT ARDivisionNo, CustomerNo
FROM AR_Customer_ShipTo 
GROUP BY ARDivisionNo, CustomerNo
HAVING COUNT(*) > 1;

(3) Ahora, en el fin de seleccionar la correcta ShipToCode para cada registro devuelto por la consulta de arriba, yo no soy capaz de averiguar, cómo iterar a través de todos los registros devueltos por la consulta anterior.

Si puedo hacer algo como:

[Consulta 2]

SELECT TOP 1 ARDivisionNo, CustomerNo, CustomerName, ShipToCode  
FROM AR_Customer_ShipTo 
WHERE ARDivisionNo = '00' and CustomerNo = '1234567'
ORDER BY ShipToCode DESC

Luego puedo conseguir el registro adecuado para (00-1234567-Prueba del Cliente). Por lo tanto, si se me permite usar todos los resultados de la consulta-1 en la consulta anterior (consulta-2), luego puedo conseguir la deseada registros único para los clientes con más de un registro. Esto puede ser combinado con los resultados del punto (1) para obtener el resultado final deseado.

De nuevo, esto puede ser más fácil que el enfoque que estoy siguiendo. Por favor, hágamelo saber cómo puedo hacer esto.

[Nota: tengo que hacer esto mediante consultas SQL sólo. No puedo utilizar procedimientos almacenados, como voy a ejecutar esta cosa, finalmente, el uso de «Escriba Insight’, que sólo me permite escribir consultas.]

OriginalEl autor Vikram | 2015-05-14

4 Comentarios

  1. 24

    Ejemplo de SQL VIOLÍN

    1) el Uso de la CTE para obtener max barco valor de código de registro basado en ARDivisionNo, Númerocliente
    para cada uno de los Clientes

    WITH cte AS (
      SELECT*, 
         row_number() OVER(PARTITION BY ARDivisionNo, CustomerNo ORDER BY ShipToCode desc) AS [rn]
      FROM t
    )
    Select * from cte WHERE [rn] = 1

    2) Para Eliminar el registro de uso de consulta de eliminación en lugar de Seleccionar y cambiar Cláusula where para rn > 1. Ejemplo de SQL VIOLÍN

    WITH cte AS (
      SELECT*, 
         row_number() OVER(PARTITION BY ARDivisionNo, CustomerNo ORDER BY ShipToCode desc) AS [rn]
      FROM t
    )
    Delete from cte WHERE [rn] > 1;
    
    select * from t;
    Muchas gracias por la respuesta y el Ejemplo de SQL VIOLINES! 🙂
    Todas las otras respuestas upvoted por mí (y mi comentario debajo de este) me han ayudado y resuelto mi problema. Estoy marcar esto como una respuesta, como Piyush tomó esfuerzo para crear y publicar de Ejemplo de SQL VIOLINES. Me gustaría poder tener marcados los demás también como una respuesta (o al menos uno por Hart CO con la explicación), pero stackoverflow sólo me permite elegir uno!
    Gracias..Vikram…Espero que usted puede conseguir su problema resuelto!! También me gustó la @Hart CO :- explicación
    Sí…muchas Gracias a todos ustedes!!! 🙂 🙂 🙂 🙂

    OriginalEl autor HaveNoDisplayName

  2. 4

    No especificar la versión de SQL Server, pero ROW_NUMBER es probablemente compatibles:

    select *
    from
     (
      select ...
         ,row_number() 
          over (partition by ARDivisionNo, CustomerNo
                order by ShipToCode desc) as rn 
      from tab
     ) as dt
    where rn = 1
    Muchas gracias por la respuesta! 🙂

    OriginalEl autor dnoeth

  3. 4

    ROW_NUMBER() es ideal para esto:

    ;WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY ARDivisionNo,CustomerNo ORDER BY ShipToCode DESC) AS RN 
                  FROM AR_Customer_ShipTo
                  )
    SELECT * 
    FROM  cte
    WHERE RN = 1

    Que mencionar la eliminación de los duplicados, si desea DELETE usted puede simplemente:

    ;WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY ARDivisionNo,CustomerNo ORDER BY ShipToCode DESC) AS RN 
                  FROM AR_Customer_ShipTo
                  )
    DELETE cte
    WHERE RN > 1

    El ROW_NUMBER() función que asigna un número a cada fila. PARTITION BY es opcional, sino que se utiliza para iniciar la numeración para cada valor en un determinado campo o grupo de campos, es decir: si PARTITION BY Some_Date, a continuación, para cada valor de fecha de la numeración de empezar de nuevo en 1. ORDER BY de campo es utilizado para definir cómo el conteo debe ir, y es necesaria en la ROW_NUMBER() función.

    Muchas gracias por la respuesta y la explicación detallada! 🙂
    Un poco de corrección: se debe partition by ARDivisionNo, CustomerNo y no partition by CustomerNo para mi ejemplo particular en la pregunta que yo le pedí.
    Actualizado en consecuencia.,

    OriginalEl autor Hart CO

  4. 3

    Con row_number función:

    SELECT * FROM(
                  SELECT ARDivisionNo, CustomerNo, CustomerName, ShipToCode,
                  row_number() over(partition by CustomerNo order by ShipToCode desc) rn
                  FROM AR_Customer_ShipTo) t
    WHERE rn = 1
    Muchas gracias por la respuesta! 🙂
    Un poco de corrección: se debe partition by ARDivisionNo, CustomerNo y no partition by CustomerNo para mi ejemplo particular en la pregunta que yo le pedí.

    OriginalEl autor Giorgi Nakeuri

Dejar respuesta

Please enter your comment!
Please enter your name here