none
CONSULTA SQL RRS feed

  • Pregunta

  • Buen día, quisiera saber como puedo sacar una muestra de una tabla que tengo en SQL, me explico, tengo una tabla (MESA_SOLICTUDES) donde tengo todos los requerimientos solucionados por mi equipo de analistas, tengo un analista que me cierra 1000 casos, de esos 1000 casos quisiera obtener solo una muestra de mas o menos 100 casos para poderle hacer una auditoria mensual, como lo puedo hacer?????
    miércoles, 12 de febrero de 2020 17:49

Respuestas

  • Deleted
    miércoles, 12 de febrero de 2020 18:33
  • Hola Cristian8703:

    Si se puede hacer de varias maneras. Te expongo una.

    CREATE TABLE MESA_SOLICITUDES (ID INT IDENTITY(1,1), SOLICITUD INT, TEXTO VARCHAR(100), ID_ANALISTA INT, FECHA DATETIME);
    CREATE TABLE ANALISTAS (ID_ANALISTA INT, NOMBRE VARCHAR(100));
    GO
    
    INSERT INTO ANALISTAS (ID_ANALISTA, NOMBRE)
    VALUES
    (1,'JUAN'),
    (2,'BEA'),
    (3,'LUISA');
    INSERT INTO MESA_SOLICITUDES (SOLICITUD, TEXTO, ID_ANALISTA, FECHA)
    VALUES
    (1,'T1',1,'20200212'),
    (2,'T1',1,'20200211'),
    (3,'T1',1,'20200214'),
    (4,'T1',1,'20200210'),
    (5,'T1',1,'20200210'),
    (6,'T1',1,'20200211'),
    (7,'T1',1,'20200213'),
    (1,'T1',2,'20200212'),
    (2,'T1',2,'20200212'),
    (3,'T1',2,'20200211'),
    (4,'T1',2,'20200213'),
    (5,'T1',2,'20200214'),
    (6,'T1',2,'20200211'),
    (7,'T1',2,'20200212'),
    (8,'T1',2,'20200212'),
    (1,'T1',3,'20200213'),
    (2,'T1',3,'20200214'),
    (3,'T1',3,'20200211'),
    (4,'T1',3,'20200212'),
    (5,'T1',3,'20200212'),
    (6,'T1',3,'20200213');

    Lo primero un escenario, donde hay dos tablas, analistas y mesa_solicitudes. Evidentemente mi ejemplo no coincidirá con tú diseño, pero creo que te será válido.

    Con las tablas creadas, vamos a preparar el aleatorio.

    CREATE VIEW [dbo].[GetNewID]
    AS
     SELECT NewId() AS [NewID]
    GO

    Genero una vista que me devuelve un valor de la funcion newId(), que retorna un valor único. Esto es porque ahora voy a utilizar una función tipo tabla, y en estas no se puede usar esta función para ordenar.

    CREATE FUNCTION dbo.FN_TOP_ALEATORIO (@ID_ANALISTA INT)
    RETURNS TABLE
    RETURN
    
    	SELECT TOP(2) B.*
    		FROM MESA_SOLICITUDES B
    	WHERE B.ID_ANALISTA = @ID_ANALISTA 
    	ORDER BY (SELECT NEWID FROM dbo.GetNewID);
    GO

    Casi toda la "enjundia" de la solución que te planteo está en esta función. Aquí puedes delimitar por fechas o por lo que quieras, ya que esta función te devolverá siempre 2 (un valor a cambiar, o incluso a recibir como parámetro), del id de analista que le llegue como parámetro.

    SELECT *
     FROM ANALISTAS A
     
     CROSS APPLY dbo.FN_TOP_ALEATORIO(A.id_analista) fn

    La solución final, no puede ser más simple. Cruzas la tabla de analistas, con las restricciones que quieras, con la función que te devuelve los dos aleatorios, mediante el operador apply.

    El resultado como podrás observar siempre es diferente.

    Espero te ayude

    miércoles, 12 de febrero de 2020 20:54
  • Hola, mira yo tengo 10 analistas que contestan solicitudes diarias, entonces si un analista responde 100 casos en el día, debo sacarle por ejemplo el 2% de muestra en este caso serian dos casos en el día, pero quiero que sean aleatorios, que sean al azar, por eso quiero saber si con una consulta de SQL puedo hacer esto...
    • Marcado como respuesta Cristian8703 viernes, 14 de febrero de 2020 14:17
    miércoles, 12 de febrero de 2020 19:11

Todas las respuestas

  • Deleted
    miércoles, 12 de febrero de 2020 18:33
  • Hola, mira yo tengo 10 analistas que contestan solicitudes diarias, entonces si un analista responde 100 casos en el día, debo sacarle por ejemplo el 2% de muestra en este caso serian dos casos en el día, pero quiero que sean aleatorios, que sean al azar, por eso quiero saber si con una consulta de SQL puedo hacer esto...
    • Marcado como respuesta Cristian8703 viernes, 14 de febrero de 2020 14:17
    miércoles, 12 de febrero de 2020 19:11
  • Hola Cristian8703:

    Si se puede hacer de varias maneras. Te expongo una.

    CREATE TABLE MESA_SOLICITUDES (ID INT IDENTITY(1,1), SOLICITUD INT, TEXTO VARCHAR(100), ID_ANALISTA INT, FECHA DATETIME);
    CREATE TABLE ANALISTAS (ID_ANALISTA INT, NOMBRE VARCHAR(100));
    GO
    
    INSERT INTO ANALISTAS (ID_ANALISTA, NOMBRE)
    VALUES
    (1,'JUAN'),
    (2,'BEA'),
    (3,'LUISA');
    INSERT INTO MESA_SOLICITUDES (SOLICITUD, TEXTO, ID_ANALISTA, FECHA)
    VALUES
    (1,'T1',1,'20200212'),
    (2,'T1',1,'20200211'),
    (3,'T1',1,'20200214'),
    (4,'T1',1,'20200210'),
    (5,'T1',1,'20200210'),
    (6,'T1',1,'20200211'),
    (7,'T1',1,'20200213'),
    (1,'T1',2,'20200212'),
    (2,'T1',2,'20200212'),
    (3,'T1',2,'20200211'),
    (4,'T1',2,'20200213'),
    (5,'T1',2,'20200214'),
    (6,'T1',2,'20200211'),
    (7,'T1',2,'20200212'),
    (8,'T1',2,'20200212'),
    (1,'T1',3,'20200213'),
    (2,'T1',3,'20200214'),
    (3,'T1',3,'20200211'),
    (4,'T1',3,'20200212'),
    (5,'T1',3,'20200212'),
    (6,'T1',3,'20200213');

    Lo primero un escenario, donde hay dos tablas, analistas y mesa_solicitudes. Evidentemente mi ejemplo no coincidirá con tú diseño, pero creo que te será válido.

    Con las tablas creadas, vamos a preparar el aleatorio.

    CREATE VIEW [dbo].[GetNewID]
    AS
     SELECT NewId() AS [NewID]
    GO

    Genero una vista que me devuelve un valor de la funcion newId(), que retorna un valor único. Esto es porque ahora voy a utilizar una función tipo tabla, y en estas no se puede usar esta función para ordenar.

    CREATE FUNCTION dbo.FN_TOP_ALEATORIO (@ID_ANALISTA INT)
    RETURNS TABLE
    RETURN
    
    	SELECT TOP(2) B.*
    		FROM MESA_SOLICITUDES B
    	WHERE B.ID_ANALISTA = @ID_ANALISTA 
    	ORDER BY (SELECT NEWID FROM dbo.GetNewID);
    GO

    Casi toda la "enjundia" de la solución que te planteo está en esta función. Aquí puedes delimitar por fechas o por lo que quieras, ya que esta función te devolverá siempre 2 (un valor a cambiar, o incluso a recibir como parámetro), del id de analista que le llegue como parámetro.

    SELECT *
     FROM ANALISTAS A
     
     CROSS APPLY dbo.FN_TOP_ALEATORIO(A.id_analista) fn

    La solución final, no puede ser más simple. Cruzas la tabla de analistas, con las restricciones que quieras, con la función que te devuelve los dos aleatorios, mediante el operador apply.

    El resultado como podrás observar siempre es diferente.

    Espero te ayude

    miércoles, 12 de febrero de 2020 20:54