by 부산주니어 [2022.04.08 15:50:34]
테이블 데이터 및 결과는 첨부파일로 올렸습니다.
tb_plan에 저장된 품목의 tb_bom에 있는 데이터를 재귀호출하여 불러오는 쿼리입니다.
WITH recursive
cte AS (
SELECT P.`prd_code` as BOM_CODES,
p1.`code` AS BOM_CODEM,
1.00 as BOM_QTY,
1.00 * P.qty AS ND_QTY,
1 * P.qty AS LS_QTY,
p1.`name`,
1 as BOM_VER
FROM tb_prod p1,
tb_plan P
WHERE P.prd_code = p1.`code`
UNION ALL
SELECT b2.prd_codes BOM_CODES,
b2.prd_codem BOM_CODEM,
b2.bom_qty,
cte.ND_QTY * b2.bom_qty AS ND_QTY,
cte.LS_QTY * b2.bom_qty AS LS_QTY,
p1.`name`,
cte.BOM_VER+1 AS BOM_VER
FROM tb_bom b2
inner join cte
ON b2.prd_codem = cte.BOM_CODES,
tb_prod p1
WHERE b2.prd_codes = p1.`code`
) SELECT * FROM cte;
이렇게 호출하면 닭갈비 소스의 qty는 3000인데 9.99로나오더라구요.
빨간색으로 표시된 부분을 1로 고치면 3000으로 똑바로 나오구요.
계산식도 없고 cte에서 불러오는 열도아니고 tb_bom에서 불러오는 열인데 왜 바뀌는 건가요?
1.00 으로 시작했을 때 Data Type 이 Decimal(3,2) 로 설정되는 듯 합니다.
그 이후 9.99 보다 큰 값이 들어와도 9.99 로 표기 되는 듯 하네요.
1 로 시작하면 INT 가 되어 소수점 계산은 안되지만 큰 수 인 3000 이 표시가 되긴 합니다.
명확하게 데이터 타입을 지정하시면 될 듯 합니다.
CAST(1.00 AS DECIMAL(9,2)) bom_qty
WITH RECURSIVE t AS
(
SELECT 1 lv
, CAST(1.00 AS DECIMAL(3,2)) x
, CAST(1.00 AS INT) y
, CAST(1.00 AS DECIMAL(9,2)) z
UNION ALL
SELECT lv + 1
, x + 1
, y + 1
, z + 1
FROM t
WHERE lv < 12
)
SELECT * FROM t
;
lv x y z
1 1.00 1 1.00
2 2.00 2 2.00
3 3.00 3 3.00
4 4.00 4 4.00
5 5.00 5 5.00
6 6.00 6 6.00
7 7.00 7 7.00
8 8.00 8 8.00
9 9.00 9 9.00
10 9.99 10 10.00
11 9.99 11 11.00
12 9.99 12 12.00
감사합니다 !
궁금했던 점까지 해결이 되었습니다 ㅠㅠㅠ