Avalados por :

Cómo crear una cadena concatenada de grupos en Crystal para roles de empleados - Guía paso a paso y SQL incluido

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 3 Vistas
0
Cargando...

Hola, he estado dando vueltas durante horas tratando de resolver esto. ¡Espero que alguien pueda echarme una mano! 😉

Tengo 4 tablas:

1) Field_Tickets - Field_Tickets.field_tickets_id es el campo principal en el que quiero agrupar.

2) Field_Tickets_Has_Employees - Se une por Field_Tickets.field_tickets_id=Field_Tickets_Has_Employees.field_tickets_id.

3) Employees - Se une por Field_Tickets_Has_Employees.employees_id=Employees.employees_id

4) Employee_Roles - Se une por Field_Tickets_Has_Employees.employee_roles_id=Employee_Roles.employee_roles_id

Me gustaría crear una cadena concatenada de grupos en Crystal que se vea como el siguiente resultado:

Supervisor        Lynn Jones

Asistente               Alan Cyr

Tuve que escribir dos declaraciones separadas, en la ventana de comandos, para lograr lo que busco y aún así no asocia el rol correcto con el empleado correspondiente. Necesito escribirlo en un solo select group_concat pero he estado dando vueltas durante demasiadas horas ahora. Aquí está el SQL que he escrito:


select ft.field_tickets_id,

(SELECT GROUP_CONCAT(CONCAT(emp.employee_first_name, ' ',emp.employee_last_name, '\n') SEPARATOR'') from employees AS emp WHERE (SELECT DISTINCT(fte.employees_id) from field_tickets_has_employees as fte WHERE ft.field_tickets_id=fte.field_tickets_id AND fte.employees_id=emp.employees_id AND IsNull(fte.deleted_at) AND fte.employee_roles_id IN (281, 282, 283, 284) group by ft.field_tickets_id)) AS employeelist,

(SELECT GROUP_CONCAT(CONCAT(emprole.employee_role_name, '', '\n') SEPARATOR '') from employee_roles AS emprole WHERE (SELECT DISTINCT(fte2.employees_id) from field_tickets_has_employees as fte2 WHERE ft.field_tickets_id=fte2.field_tickets_id AND fte2.employee_roles_id=emprole.employee_roles_id AND IsNull(fte2.deleted_at) AND fte2.employee_roles_id IN (281, 282, 283, 284) group by ft.field_tickets_id)) AS emplistroles

from field_tickets AS ft

INNER JOIN jobs ON ft.jobs_id=jobs.jobs_id where

IsNull(ft.deleted_at)


¡Gracias!

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola Jamie... la presentación del informe me está llevando a esto. Además, hay dos tablas de subformularios vinculadas a la tabla principal de tickets de campo: field_tickets_has_employees.field_tickets_id Y field_tickets_has_resources.field_tickets_id son ambos subformularios unidos a la tabla principal field_tickets.field_tickets_id.

Por lo tanto, no puedo unir ambas tablas directamente en la consulta SQL principal (estoy usando la base de datos MySQL) ya que produce múltiples registros. He intentado agrupar pero no tiene sentido porque Crystal agrupa de forma lineal y estas dos tablas son completamente separadas.

Además, divido los datos del subformulario dentro del informe. Por ejemplo, dependiendo del employee_roles_id colocaré algunos registros de la tabla field_tickets_has_employees en el lado izquierdo del informe y diferentes valores de employee_roles_id se colocarán en algún lugar del lado derecho del informe. Entre ellos se intercalarán registros de la tabla field_tickets_has_resources.

¿Tiene sentido?

Mark

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Mark,

¿Estás utilizando mysql? En caso contrario, ¿qué base de datos estás usando?...puede haber otras opciones que usen un conjunto de subconsultas.

Si estás utilizando mysql, podrías intentar eliminar las subconsultas separadas y crear una tabla derivada definida en un join. Por ejemplo, puedes ver aquí . De esta manera, teóricamente podrías traer información de empleado y rol de una vez.

Pregunta... ¿Hubo alguna razón en particular por la que optaste por las subconsultas en lugar de crear el informe a partir de las 4 tablas? ¿Es por los duplicados?

-Jamie

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Jamie... gracias por tu respuesta. Tienes razón... quiero una declaración de subselección que vincule el employees_id con el employee_roles_id. Mi SQL sigue fallando cuando intento hacer esa vinculación común en una declaración de subselección. Si puedo resolver este problema, puedo aplicarlo a tantos otros escenarios para reducir mi dependencia de subinformes.

Gracias,
Mark

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Mark,

¿Hay alguna razón en particular por la que quieras usar Group_Concat aparte de preformatear una lista de empleados y roles en formato vertical?

La razón por la que pregunto es que deberías poder crear este tipo de formato en cr simplemente trayendo tus 4 tablas usando los enlaces que describiste arriba (es decir, sin las subconsultas), agrupar por ticket_id, y luego poner un crosstab en el encabezado del grupo de ticket id con roles y nombres de empleados (usar una fórmula para concatenar nombre y apellido) como filas.

De una rápida mirada al sql puede ser que solo esté asociando un rol con un ticket id y no necesariamente con un id de empleado... es decir, la concatenación de nombres de empleados se hace a nivel de ticket id y la concatenación de roles se hace a nivel de ticket id ya que están en subconsultas de una consulta principal que no incluye la información del empleado... supongo que puede haber más de un id de empleado por ticket, ¿correcto?

-jamie

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?