mssql 비율로 나누기 및 보정에 대해 질문드립니다. 0 6 637

by HJJH [SQL Query] [2021.10.28 16:11:21]


캡처333.JPG (29,395Bytes)

임시 테이블에 있는 값을 비율로 환산하여 테이블에 있는  수량을 정수로 나누어주고 남는값이 있으면 맨처음행에 보정을 하고 싶습니다.

예를 들어 임시테이블 값이 4,2 라면 수량 2521 을 80프로 와 20프로의 비율로 나누어주면

2016 504 과 되는데 나머지 1은 첫번째 행에 보정을 해주고 싶습니다.

임시테이블이 값이 2라면 33 프로씩 정수로 나누어주고 나머지는 첫행에 보정을 하는 그런 방식입니다.

제실력으론 부족한거 같아 질문 드려봅니다 .

by 우주민 [2021.10.28 16:34:41]

수량을 80% / 20% 로 나누는게 맞나요?

2/6 과 4/6 으로 나눠야 하는거 아닐지....


by 우주민 [2021.10.28 17:18:36]
WITH 테이블 AS (
  SELECT '1' AS 키값, 2521 AS 수량 UNION ALL
  SELECT '2' AS 키값, 2220 AS 수량   
),
임시테이블 AS (
 SELECT '1' AS RN, 2 AS AMT UNION ALL  
 SELECT '2' AS RN, 2 AS AMT UNION ALL  
 SELECT '3' AS RN, 2 AS AMT 
)
,TEMP AS (
SELECT T1.키값, T2.RN
,T1.수량
,T1.수량 * (T2.AMT / SUM(T2.AMT) OVER(PARTITION BY T1.키값)) AS 배분_소수점
,ROUND(T1.수량 * (T2.AMT / SUM(T2.AMT) OVER(PARTITION BY T1.키값)),0) AS 배분
FROM 테이블 T1
,임시테이블 T2
)
SELECT 키값, RN, 수량
, 배분_소수점
, 배분 
, 배분 + CASE WHEN RN = 1 THEN 수량 - SUM(배분) OVER(PARTITION BY 키값) ELSE 0 END  AS  결과값
FROM TEMP 
ORDER BY 키값, RN

 

대략 이런 식으로 처리하면 될듯 합니다.

제가 정확하게 이해한 거라면... 흠....


by HJJH [2021.10.29 09:11:37]

감사합니다 참고 해보도록 하겠습니다


by 마농 [2021.10.29 10:00:27]

MSSQL 에서는 정수끼리의 나누셈은 정수를 반환합니다.
(4 / 6) 은 0.666667 이 아닌 0 이 나오게 됩니다.
따라서 이 점 주의하셔서 괄호를 수정하셔야 합니다.
- 수정전 : T1.수량 * (T2.AMT / SUM(T2.AMT) OVER(PARTITION BY T1.키값)) = 2521 * (4 / 6) = 0
- 수정후 : T1.수량 * T2.AMT / SUM(T2.AMT) OVER(PARTITION BY T1.키값) = 2521 * 4 / 6 = 1680


by 마농 [2021.10.29 08:30:48]
WITH t1 AS
(
-- Case 1 --
SELECT 1 no, 4 amt
UNION ALL SELECT 2, 2
-- Case 2 --
--SELECT 1 no, 2 amt
--UNION ALL SELECT 2, 2
--UNION ALL SELECT 3, 2
)
, t2 AS
(
SELECT 1 id, 2521 cnt
UNION ALL SELECT 2, 2220
)
SELECT a.id
     , a.cnt
     , b.no
     , b.amt
     , a.cnt * amt / s
     + CASE WHEN a.id = 1
       THEN a.cnt - SUM(a.cnt * amt / s) OVER(PARTITION BY a.id)
       ELSE 0
        END x
  FROM t2 a
 CROSS JOIN (SELECT no, amt, SUM(amt) OVER() s FROM t1) b
 ORDER BY a.id, b.no
;

 


by HJJH [2021.10.29 09:11:46]

정말 감사합니다~

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입