From 93c643cb8e92558d9e2ffc4cd923c48b18bc3415 Mon Sep 17 00:00:00 2001 From: thug0bin Date: Fri, 13 Mar 2026 00:19:34 +0900 Subject: [PATCH] =?UTF-8?q?fix(rx-usage):=20GROUP=20BY=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EA=B0=9C=EC=84=A0=EC=9C=BC=EB=A1=9C=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EB=B2=84=EA=B7=B8=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 문제 - 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 기준 정렬 (투약량순) --- backend/app.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/app.py b/backend/app.py index c43e9cd..44e189b 100644 --- a/backend/app.py +++ b/backend/app.py @@ -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, {