fix(rx-usage): GROUP BY 구조 개선으로 중복 버그 해결

## 문제
- ORDER BY를 INV_QUAN으로 변경 시 같은 약품이 중복 표시됨
- 예: 수인 30개 주문 → '수인 30, 수인 30' (60개로 잘못 표시)

## 근본 원인
- GROUP BY에 JOIN된 테이블 컬럼(IT.IM_QT_sale_debit, POS.CD_NM_sale) 포함
- IM_total, CD_item_position이 1:N 관계일 때 같은 DrugCode가 여러 행으로 팽창
- GROUP BY가 이 값들을 포함하여 중복 행 유지

## 해결
- GROUP BY를 P.DrugCode 만으로 축소 (진짜 그룹핑 기준만)
- 나머지 컬럼은 MAX() 집계함수 사용
- DrugCode당 정확히 1행 보장

## 변경 내용
- GROUP BY: 6개 컬럼 → 1개 (P.DrugCode)
- SELECT: ISNULL() → MAX(ISNULL()) 래핑
- ORDER BY: INV_QUAN 기준 정렬 (투약량순)
This commit is contained in:
thug0bin 2026-03-13 00:19:34 +09:00
parent 94dea2ab3a
commit 93c643cb8e

View File

@ -5102,15 +5102,15 @@ def api_rx_usage():
rx_query = text("""
SELECT
P.DrugCode as drug_code,
ISNULL(G.GoodsName, '알 수 없음') as product_name,
ISNULL(G.SplName, '') as supplier,
MAX(ISNULL(G.GoodsName, '알 수 없음')) as product_name,
MAX(ISNULL(G.SplName, '')) as supplier,
SUM(ISNULL(P.QUAN, 1)) as total_qty,
SUM(ISNULL(P.INV_QUAN, 0)) as total_dose, -- 투약량 (1회복용량 x 복용횟수 x 일수)
SUM(ISNULL(P.DRUPRICE, 0)) as total_amount, -- DRUPRICE 합계
COUNT(DISTINCT P.PreSerial) as prescription_count,
COALESCE(NULLIF(G.BARCODE, ''), '') as barcode,
ISNULL(IT.IM_QT_sale_debit, 0) as current_stock,
ISNULL(POS.CD_NM_sale, '') as location
MAX(COALESCE(NULLIF(G.BARCODE, ''), '')) as barcode,
MAX(ISNULL(IT.IM_QT_sale_debit, 0)) as current_stock,
MAX(ISNULL(POS.CD_NM_sale, '')) as location
FROM PS_sub_pharm P
LEFT JOIN PM_DRUG.dbo.CD_GOODS G ON P.DrugCode = G.DrugCode
LEFT JOIN PM_DRUG.dbo.IM_total IT ON P.DrugCode = IT.DrugCode
@ -5118,8 +5118,8 @@ def api_rx_usage():
WHERE P.Indate >= :start_date
AND P.Indate <= :end_date
AND (P.PS_Type IS NULL OR P.PS_Type != '9')
GROUP BY P.DrugCode, G.GoodsName, G.SplName, G.BARCODE, IT.IM_QT_sale_debit, POS.CD_NM_sale
ORDER BY SUM(ISNULL(P.QUAN, 1) * ISNULL(P.Days, 1)) DESC
GROUP BY P.DrugCode
ORDER BY SUM(ISNULL(P.INV_QUAN, 0)) DESC -- 투약량 기준 정렬
""")
rows = mssql_session.execute(rx_query, {