61 lines
1.6 KiB
Python
61 lines
1.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
import pyodbc
|
|
import time
|
|
|
|
conn_str = (
|
|
'DRIVER={ODBC Driver 17 for SQL Server};'
|
|
'SERVER=192.168.0.4\\PM2014;'
|
|
'DATABASE=PM_PRES;'
|
|
'UID=sa;'
|
|
'PWD=tmddls214!%(;'
|
|
'TrustServerCertificate=yes;'
|
|
'Connection Timeout=10'
|
|
)
|
|
|
|
conn = pyodbc.connect(conn_str, timeout=10)
|
|
cur = conn.cursor()
|
|
|
|
# 현재 쿼리 성능 측정
|
|
start = time.time()
|
|
|
|
query = """
|
|
WITH PatientUsage AS (
|
|
SELECT DISTINCT
|
|
P.DrugCode,
|
|
M.Paname,
|
|
MAX(CASE WHEN M.Indate >= '20260306' AND M.Indate <= '20260306' THEN 1 ELSE 0 END) as used_in_period
|
|
FROM PS_sub_pharm P
|
|
JOIN PS_main M ON P.PreSerial = M.PreSerial
|
|
WHERE M.Indate >= CONVERT(VARCHAR, DATEADD(YEAR, -1, GETDATE()), 112)
|
|
GROUP BY P.DrugCode, M.Paname
|
|
)
|
|
SELECT
|
|
PU.DrugCode as drug_code,
|
|
COUNT(*) as patient_count,
|
|
STUFF((
|
|
SELECT ', ' + PU2.Paname
|
|
FROM PatientUsage PU2
|
|
WHERE PU2.DrugCode = PU.DrugCode
|
|
ORDER BY PU2.Paname
|
|
FOR XML PATH(''), TYPE
|
|
).value('.', 'NVARCHAR(MAX)'), 1, 2, '') as patient_names,
|
|
STUFF((
|
|
SELECT ', ' + PU3.Paname
|
|
FROM PatientUsage PU3
|
|
WHERE PU3.DrugCode = PU.DrugCode AND PU3.used_in_period = 1
|
|
ORDER BY PU3.Paname
|
|
FOR XML PATH(''), TYPE
|
|
).value('.', 'NVARCHAR(MAX)'), 1, 2, '') as today_patients
|
|
FROM PatientUsage PU
|
|
GROUP BY PU.DrugCode
|
|
HAVING COUNT(*) <= 3
|
|
"""
|
|
|
|
cur.execute(query)
|
|
rows = cur.fetchall()
|
|
elapsed = time.time() - start
|
|
|
|
print(f"결과: {len(rows)}개 약품")
|
|
print(f"실행 시간: {elapsed:.2f}초")
|
|
print(f"약품당: {elapsed/len(rows)*1000:.2f}ms" if rows else "")
|