1

Tengo una tabla llamada "Lotes" con dos columnas, una llamada "Lote" y una llamada "Material" (un lote puede tener dos materiales asociados). La pregunta es: ¿Cómo hacer en SQL Server para identificar solamente el lote que tenga asociado 2 materiales?

La imagen muestra los datos, resaltando "Lote" y los dos materiales:

introducir la descripción de la imagen aquí

Quisiera un resumen de este tipo

introducir la descripción de la imagen aquí

Probé con el siguiente código pero no encuentro la forma correcta:

select * from Lotes
where Lote IN(
SELECT Lote FROM Lotes
GROUP BY Lote
HAVING COUNT(*) <1
)
ORDER BY Lote
miguel
  • 23
  • 4
  • ¿Deseas únicamente aquellos lotes que tienen 2 materiales asociados?¿Que pasa con aquellos que tienen más de 2, también se excluirán? – Josue Arriola Aug 01 '20 at 03:31
  • Leyendo mi respuesta y la de Pablo, veo que hay ambigüedad en la pregunta, que creí entender al inicio. Por favor explica con mayor precisión: ¿qué significa "Tener dos materiales"? – jachguate Aug 01 '20 at 07:06
  • Lo que sucede es que hay un lote que puede tener 1 o 2 materiales máximo, por esa razón queria seleccionar ese caso. – miguel Aug 01 '20 at 15:22

2 Answers2

2

La instrucción que buscas es la siguiente:

SELECT Lote, Material FROM lotes GROUP BY Lote, Material HAVING COUNT(*) > 1

Considera evitar el uso de Select * siempre es más eficiente enviar la lista de columnas requeridas al manejador.

Recuerda también que las preguntas serán mejor recibidas si en lugar de imagenes, proporcionas los datos en forma de texto.

Pablo Gutiérrez
  • 2,354
  • 2
  • 5
  • 14
2

Vamos por pasos.

Primero, podemos identificar todos los lotes que tienen exactamente dos materiales, valiéndonos de count(distinct ), para obtener el número de distintos materiales que tiene cada lote, y agregar una cláusula having para dejar en el resultado solamente aquellos que tienen exactamente dos materiales. En SQL, la consulta luciría así:

select lote, count(distinct material) contador
  from Lotes
 group by lote
having count(distinct material) = 2

Para lograr el resultado que buscas, entonces, podemos colocar esta consulta dentro de un CTE y hacer join entre la tabla original y este resultado, para obtener los materiales de los lotes:

Por ejemplo:

;
with
DosMateriales as (
select lote, count(distinct material) contador
  from Lotes
 group by lote
having count(distinct material) = 2
)
select distinct l.Lote, l.Material
  from Lotes l
       inner join DosMateriales d on d.lote = l.lote

Esto nos devolverá el resultado que buscas:

Lote       Material
---------- -----------
20082019   3021814
20082019   7000225

(2 rows affected)


Completion time: 2020-08-01T00:54:23.6145373-06:00
jachguate
  • 25,659
  • 7
  • 35
  • 61