한 필드를 기반으로 .CSV 행(MySQL의 출력)을 병합하고 다른 필드의 합계를 계산합니다.

한 필드를 기반으로 .CSV 행(MySQL의 출력)을 병합하고 다른 필드의 합계를 계산합니다.

편집하다:

toppk에서 제안한 솔루션을 살펴보겠습니다.


이를 위해 SELECT 문을 어떻게 조정합니까?

월별 결제 보고서에서 일치하는 행을 병합하고 동일한 작업에 대한 항목을 병합하고 싶습니다. 스크립트는 지원 티켓에서 MySQL 쿼리를 추출하여 csv에 덤프합니다. 일반적으로 저는 이전 달의 기간을 제공합니다.

많은 작업에는 여러 시간 항목이 있으므로 이를 한 줄로 결합하는 것이 가장 좋습니다.

스크립트는 청구 고객을 기준으로 정렬한 다음 작업을 기준으로 최종 보고서의 .CSV를 생성합니다. 개인정보 보호를 위해 예시를 편집했지만, 실제 보고서의 청구 총액은 정확합니다.

Desired result from this sample output:
 - combine the three entries for ticket 8732 (audio system) into a single 630m (10.5h) line
 - combine ticket 8789 (cabinet meeting) into one 120m line
 - combine ticket 8182 (backups) into a single 240m line
et cetera

예.CSV 발췌: 고객, 티켓 번호, 시간(시간);

"client","subject","#","time","hours","status","dept"
,,,,,
"museum","audio system: reconfigure and test","8732","30","0.5","closed","Production"
"museum","audio system: reconfigure and test","8732","210","3.5","closed","Production"
"museum","audio system: reconfigure and test","8732","390","6.5","closed","Production"
"museum","documentary premiere in gallery","8733","240","4.0","closed","Production"
"museum","audio and Lectern support","8767","30","0.5","closed","IT_Support"
"museum","County manager cabinet meeting","8789","30","0.5","closed","IT_Support"
"museum","County manager cabinet meeting","8789","90","1.5","closed","IT_Support"
"museum","mass file duplication","8834","45","0.75","closed","IT_Support"
"museum","audio system support","8835","45","0.75","closed","IT_Support"
"museum","PC browser support","8836","45","0.75","closed","IT_Support"
"museum","audio system issues","8840","30","0.5","closed","IT_Support"
"museum","equipment move","8871","75","1.25","closed","IT_Support"
,,,1335,22.25,hours
,,,,,
,,,,,
"dental office","ongoing: manual Eaglesoft backup","8182","30","0.5","open","IT_Support"
"dental office","ongoing: manual Eaglesoft backup","8182","30","0.5","open","IT_Support"
"dental office","ongoing: manual Eaglesoft backup","8182","30","0.5","open","IT_Support"
"dental office","ongoing: manual Eaglesoft backup","8182","30","0.5","open","IT_Support"
"dental office","ongoing: manual Eaglesoft backup","8182","30","0.5","open","IT_Support"
"dental office","ongoing: manual Eaglesoft backup","8182","30","0.5","open","IT_Support"
"dental office","ongoing: manual Eaglesoft backup","8182","30","0.5","open","IT_Support"
"dental office","ongoing: manual Eaglesoft backup","8182","30","0.5","open","IT_Support"
"dental office","failed monitor support","8724","30","0.5","closed","IT_Support"
"dental office","backups server crash","8726","135","2.25","closed","IT_Support"
"dental office","backups server crash","8726","75","1.25","closed","IT_Support"
"dental office","hypervisor virtual backups","8730","120","2","closed","IT_Support"
"dental office","panoramic x-ray access issue","8734","105","1.75","closed","IT_Support"
"dental office","unusual phone behavior / call quality issues","8744","75","1.25","closed","IT_Support"
"dental office","server room power issue","8752","75","1.25","closed","IT_Support"
"dental office","Eaglesoft error","8759","30","0.5","closed","IT_Support"
"dental office","server issue: filesystem management","8761","75","1.25","closed","IT_Support"
"dental office","server room power issue","8780","45","0.75","closed","IT_Support"
"dental office","Eaglesoft schedule problem","8782","60","1","closed","IT_Support"
"dental office","PC power problem","8865","105","1.75","closed","IT_Support"
,,,1290,21.50,hours
,,,,,
,,,,,
,,Total,13125 m,218.75,hours

(그래서 박물관 섹션은 12줄이 아닌 9줄의 출력으로 끝나게 됩니다)

다음은 awk 및 sed를 통해 파이프된 CSV인 SELECT 문입니다.

/usr/bin/mysql osticket -Be "SELECT
  ost_organization.name as 'client', ost_ticket__cdata.subject, ost_ticket.ticket_id as '#', ost_thread_entry.time_spent as 'time', ost_thread_entry.time_type as 'how', ost_ticket_status.state as status, ost_department.name as dept
FROM ost_organization
JOIN ost_user
  ON ost_organization.id = ost_user.org_id
JOIN ost_ticket
  ON ost_user.id = ost_ticket.user_id
JOIN ost_ticket_status
  on ost_ticket_status.id = ost_ticket.status_id
JOIN ost_ticket__cdata
  ON ost_ticket.ticket_id = ost_ticket__cdata.ticket_id
JOIN ost_thread
  ON ost_thread.object_id = ost_ticket.ticket_id
JOIN ost_department
  ON ost_department.id = ost_ticket.dept_id
JOIN ost_thread_entry
  ON ost_thread_entry.thread_id = ost_thread.id 
 AND ost_thread_entry.time_type != 7
 AND ost_thread_entry.time_bill = 1
 AND ost_thread_entry.staff_id = $MyAgentID
 AND ost_thread_entry.time_spent != 0 and ost_thread_entry.created regexp '$Today'
ORDER BY $SortFlag
;" | awk -F"    " 'BEGIN{OFS=FS};{print $1,$2,$3,$4,($4/60),$6,$7}' | sed 's/^/"/;s/$/"/;s/ /","/g'

따라서 [ost_thread_entry.time_spent]의 합계를 계산해야 합니다... 하지만 [ost_ticket.ticket_id]가 동일한 경우에만 가능합니다. 이를 수행하려면 이 SELECT 문을 어떻게 조정해야 합니까?

노트:

  • "$Today" 변수는 스크립트에 CLI 매개변수로 제공하는 날짜입니다(예: 지난 달의 2022-08). 기본값은 [오늘]입니다(예: 2022-09-06).
  • 티켓팅 시스템은 시간 추적을 위한 타사 모드가 포함된 OS 티켓입니다.
  • 데이터베이스는 시간을 분 단위로 저장합니다. 스크립트는 이 시간을 기준으로 시간을 계산합니다.
  • 나의 첫 번째 성향은 아래와 유사한 awk를 사용하는 것이지만, 이를 위해서는 스크립트가 중복된 줄을 먼저 평가해야 하므로 훨씬 덜 효율적이라고 생각됩니다. 내 직감은 더 똑똑한 데이터베이스 솔루션이 있다고 말합니다.

awk -F '","' '$3 == 8182 {print $4}' report.csv

읽어 주셔서 감사합니다

관련 정보