Files
hallasanup/쿼리/Template/원가계산.sql
2026-06-23 17:45:48 +09:00

1828 lines
40 KiB
Transact-SQL

USE [ACC]
GO
/****** Object: StoredProcedure [dbo].[usp_frm21404_01] Script Date: 2023-02-21 오전 10:33:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ==========================================
-- 작업일자: YYYY-MM-DD [쿼리 작성 및 실행 날짜를 기록합니다.]
-- 작 성 자: [실행자 이름을 기록합니다.]
-- 작업목적: [회계장부로 원가계산기능을 순차적으로 실행하며 중간산출자료 등을 검토할 목적으로 만든 쿼리이며 원가계산 프로시저입니다.]
-- 요청자/티켓번호: [회계팀의 요청시 원가계산을 검토하는 용도입니다.]
-- 데이타베이스 : MS-SQL
-- ==========================================
/*************************************************************/
/* 재료비 집계 & 간접 재료비 배부 */
/* 노무비 집계 & 간접 노무비 배부 */
/* 경 비 집계 & 간접 경 비 배부 */
/* 외주비 집계 & 간접 외주비 배부 */
/*************************************************************/
-- exec ACC.dbo.usp_frm21404_01 @area = '9', @saupbu = '10', @frdate = '20110101', @todate = '20110930'
-- ALTER PROCEDURE [dbo].[usp_frm21404_01]
drop table #temp_t23a10
DECLARE
@area CHAR(1) ,
@saupbu CHAR(2),
@frdate CHAR(8),
@todate CHAR(8)
-- AS
SELECT @area = '9', @saupbu = '10', @frdate = '20220101', @todate = '20221231'
DECLARE @totamt DECIMAL(20,0)
DECLARE @yy CHAR(4)
SET @yy = SUBSTRING(@frdate,1,4)
CREATE TABLE #temp_t23a10
(
area CHAR(1) null,
apvdate CHAR(8) null,
apvnum CHAR(6) null,
apvseq CHAR(6) null,
saupbu CHAR(2) null,
acntcode CHAR(7) null,
vendorcd VARCHAR(20) null,
pjtno VARCHAR(20) null,
apvdramt DECIMAL,
apvcramt DECIMAL,
hyundae CHAR(1) null,
dr_cr CHAR(1) null
)
--============ 조정후 시작(2011.11.16)
INSERT
#temp_t23a10
SELECT
area,apvdate,apvnum,apvseq,saupbu,acntcode,vendorcd,pjtno,apvdramt,apvcramt,hyundae,dr_cr
FROM
ACC.dbo.t23a10
WHERE area = @area
AND saupbu = @saupbu
AND apvdate BETWEEN SUBSTRING(@todate,1,4) AND @todate
UPDATE
a
SET
acntcode = (CASE WHEN b.c_acntcode <> '' THEN b.c_acntcode ELSE a.acntcode END)
, pjtno = (CASE WHEN b.c_pjtno <> '' THEN b.c_pjtno ELSE a.pjtno END)
FROM
#temp_t23a10 a
JOIN
ACC.dbo.t23w70 b
ON
a.apvdate = b.apvdate and a.apvnum = b.apvnum and a.apvseq = b.apvseq
--============ 조정후 종료
/* 지움 */
DELETE
ACC.dbo.t23w20 -- 원가계산마스타
WHERE
yy = @yy
DECLARE @temp_s1 TABLE
(
pjtno VARCHAR(10)
, acntcode VARCHAR(7)
, mon VARCHAR(2)
, slpamt DECIMAL(20,2)
)
DECLARE @temp_s2 TABLE
(
pjtno VARCHAR(10)
, yy CHAR(4)
, hg_gijun CHAR(1)
)
INSERT
@temp_s2
SELECT
c.pjtno_rep pjtno, a.yy, a.hg_gijun
FROM
ACC.dbo.t23w60 a
JOIN
ACC.dbo.t23w50 c
ON
a.yy = c.yy and a.pjtno = c.pjtno_rep
WHERE
a.yy = @yy
UNION
SELECT
c.pjtno_slip pjtno, a.yy, a.hg_gijun
FROM
ACC.dbo.t23w60 a
JOIN
ACC.dbo.t23w50 c
ON
a.yy = c.yy and a.pjtno = c.pjtno_rep
WHERE
a.yy = @yy
--==============================================================================================
-- 원가계산 공사진행율로 인식
-- 직접비와 간접비를 산출한다.
-- 직접비는 재료비는 프로젝트별 하나의 계정 월별로 합계액을 구한다.
-- 노무비는 프로젝트별 급여, 상여, 기타(나머지는 기타로)별 월별로 합계액을 구한다.
-- 경비는 프로젝트별 각 계정별 월별로 합계액을 구한다.
-- 외주비는 프로젝트별 하나의 계정 월별로 합계액을 구한다.
-- 간접비는 간접비 배부기준에서 불러와서 체크된 것에 한해서 프로젝트별 계정별 월별에 배부한다.
--==============================================================================================
/* 재료비 직접비 집계 -->월별로 재료비 하나로만 관리*/
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'91'),
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode = '91'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '91%'
AND apvdate >= @frdate
AND apvdate <= @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '1'
ORDER BY
a.pjtno
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'91'),
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode = '91'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '91%'
-- AND apvdate >= @frdate
AND apvdate = @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '1'
ORDER BY
a.pjtno
/* 노무비 직접비 집계 --> 프로젝트별 계정과목별 월별 금액*/
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'9200101') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '92%'
AND apvdate >= @frdate
AND apvdate <= @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '1'
ORDER BY
a.pjtno
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'9200101') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '92%'
-- AND apvdate >= @frdate
AND apvdate = @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '1'
ORDER BY
a.pjtno
/* 경 비 직접비 집계 */
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'9300101') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '93%'
AND apvdate >= @frdate
AND apvdate <= @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '1'
ORDER BY
a.pjtno
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'9300101') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '93%'
-- AND apvdate >= @frdate
AND apvdate = @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '1'
ORDER BY
a.pjtno
/* 외주비 직접비 집계 */
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'94') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode = '94'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '94%'
AND apvdate >= @frdate
AND apvdate <= @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '1'
ORDER BY
a.pjtno
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'94') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode = '94'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '94%'
-- AND apvdate >= @frdate
AND apvdate = @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '1'
ORDER BY
a.pjtno
/* 전표등록된 공사코드 ---> 원가계산용 공사코드로 변경 */
UPDATE
@temp_s1
SET
pjtno = b.pjtno_rep
FROM
@temp_s1 a
JOIN
ACC.dbo.t23w50 b
ON
b.yy = @yy and a.pjtno = b.pjtno_slip
/* 원가계산 테이블에 저장 ---> 프로젝트별 계정별 월별 직접비 금액*/
INSERT
ACC.dbo.t23w20
(yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
SELECT
@yy
, pjtno, acntcode
, indi = '1'--직접비
, mon
, amt = ISNULL(SUM(slpamt),0)
, rate = 0
, gijun = '1' -- 공사진행율 인식
FROM
@temp_s1
WHERE
pjtno <> 'AA'
GROUP BY
pjtno, acntcode, mon
ORDER BY
pjtno, acntcode, mon
--=================================================================
-- 원가계산 세금계산서 발행금액으로 인식(직접비만 산출한다.)
--=================================================================
DELETE @temp_s1
/* 재료비 직접비 집계 -->월별로 재료비 하나로만 관리*/
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'91'),
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode = '91'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '91%'
AND apvdate >= @frdate
AND apvdate <= @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '2'
ORDER BY
a.pjtno
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'91'),
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode = '91'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '91%'
-- AND apvdate >= @frdate
AND apvdate = @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '2'
ORDER BY
a.pjtno
/* 노무비 직접비 집계 --> 프로젝트별 계정과목별 월별 금액*/
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'9200101') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '92%'
AND apvdate >= @frdate
AND apvdate <= @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '2'
ORDER BY
a.pjtno
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'9200101') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '92%'
-- AND apvdate >= @frdate
AND apvdate = @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '2'
ORDER BY
a.pjtno
/* 경 비 직접비 집계 */
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'9300101') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '93%'
AND apvdate >= @frdate
AND apvdate <= @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '2'
ORDER BY
a.pjtno
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'9300101') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '93%'
-- AND apvdate >= @frdate
AND apvdate = @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '2'
ORDER BY
a.pjtno
/* 외주비 직접비 집계 */
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'94') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode = '94'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '94%'
AND apvdate >= @frdate
AND apvdate <= @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '2'
ORDER BY
a.pjtno
INSERT
@temp_s1
SELECT
a.pjtno,
acntcode = ISNULL(b.acntcode,'94') ,
mon = ISNULL(b.mon,'01'),
slpamt = ISNULL(b.slpamt,0)
FROM
@temp_s2 a
JOIN
(
SELECT
pjtno = ISNULL(pjtno,'')
, acntcode = '94'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '94%'
-- AND apvdate >= @frdate
AND apvdate = @todate
AND saupbu = @saupbu
AND area = @area
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
) b
ON
a.pjtno = b.pjtno
WHERE
a.yy = @yy
AND a.hg_gijun = '2'
ORDER BY
a.pjtno
/* 전표등록된 공사코드 ---> 원가계산용 공사코드로 변경 */
UPDATE
@temp_s1
SET
pjtno = b.pjtno_rep
FROM
@temp_s1 a
JOIN
ACC.dbo.t23w50 b
ON
b.yy = @yy and a.pjtno = b.pjtno_slip
/* 원가계산 테이블에 저장 ---> 프로젝트별 계정별 월별 직접비 금액*/
INSERT
ACC.dbo.t23w20
(yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
SELECT
@yy
, pjtno, acntcode
, indi = '1'--직접비
, mon
, amt = ISNULL(SUM(slpamt),0)
, rate = 0
, gijun = '2' -- 세금계산서 발행금액 인식
FROM
@temp_s1
WHERE
pjtno <> 'AA'
GROUP BY
pjtno, acntcode, mon
ORDER BY
pjtno, acntcode, mon
/* ------------------------------------------------------------------- */
/* 간접비는 원가배부기준이 1인것에만 프로젝트별 계정별 월별로 배부한다.*/
/* 간접비는 공사코드가 AA인 것만 합치면 된다. */
/* 간접비는 직접비의 비율에 따라서 배부한다. */
/* ------------------------------------------------------------------- */
DELETE @temp_s1
/* 재료비 간접집계 -- 하나의 계정으로 관리*/
INSERT
@temp_s1
SELECT
pjtno
, acntcode = '91'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '91%'
AND saupbu = @saupbu
AND area = @area
AND apvdate >= @frdate
AND apvdate <= @todate
-- AND pjtno = 'AA'
AND (pjtno = 'AA' OR pjtno IN (select pjtno_slip from ACC.dbo.t23w50 where yy = substring(@frdate,1,4) and pjtno_rep = 'AA'))
GROUP BY
pjtno, SUBSTRING(apvdate,5,2)
INSERT
@temp_s1
SELECT
pjtno
, acntcode = '91'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '91%'
AND saupbu = @saupbu
AND area = @area
-- AND apvdate >= @frdate
AND apvdate = @todate
-- AND pjtno = 'AA'
AND (pjtno = 'AA' OR pjtno IN (select pjtno_slip from ACC.dbo.t23w50 where yy = substring(@frdate,1,4) and pjtno_rep = 'AA'))
GROUP BY
pjtno, SUBSTRING(apvdate,5,2)
/* 노무비 간접비 집계 -- 급여, 상여, 기타로 관리하기로 했는데 일단 계정별로 */
INSERT
@temp_s1
SELECT
pjtno
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '92%'
AND saupbu = @saupbu
AND area = @area
AND apvdate >= @frdate
AND apvdate <= @todate
-- AND pjtno = 'AA'
AND (pjtno = 'AA' OR pjtno IN (select pjtno_slip from ACC.dbo.t23w50 where yy = substring(@frdate,1,4) and pjtno_rep = 'AA'))
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
INSERT
@temp_s1
SELECT
pjtno
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '92%'
AND saupbu = @saupbu
AND area = @area
-- AND apvdate >= @frdate
AND apvdate = @todate
-- AND pjtno = 'AA'
AND (pjtno = 'AA' OR pjtno IN (select pjtno_slip from ACC.dbo.t23w50 where yy = substring(@frdate,1,4) and pjtno_rep = 'AA'))
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
/* 경비 간접비 집계 --계정별로 합계를 구한다. */
INSERT
@temp_s1
SELECT
pjtno
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '93%'
AND saupbu = @saupbu
AND area = @area
AND apvdate >= @frdate
AND apvdate <= @todate
-- AND pjtno = 'AA'
AND (pjtno = 'AA' OR pjtno IN (select pjtno_slip from ACC.dbo.t23w50 where yy = substring(@frdate,1,4) and pjtno_rep = 'AA'))
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
INSERT
@temp_s1
SELECT
pjtno
, acntcode
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '93%'
AND saupbu = @saupbu
AND area = @area
-- AND apvdate >= @frdate
AND apvdate = @todate
-- AND pjtno = 'AA'
AND (pjtno = 'AA' OR pjtno IN (select pjtno_slip from ACC.dbo.t23w50 where yy = substring(@frdate,1,4) and pjtno_rep = 'AA'))
GROUP BY
pjtno, acntcode, SUBSTRING(apvdate,5,2)
/* 외주비 간접비 집계 --하나의 계정으로 합계를 구한다. */
INSERT
@temp_s1
SELECT
pjtno
, acntcode = '94'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '94%'
AND saupbu = @saupbu
AND area = @area
AND apvdate >= @frdate
AND apvdate <= @todate
-- AND pjtno = 'AA'
AND (pjtno = 'AA' OR pjtno IN (select pjtno_slip from ACC.dbo.t23w50 where yy = substring(@frdate,1,4) and pjtno_rep = 'AA'))
GROUP BY
pjtno, SUBSTRING(apvdate,5,2)
INSERT
@temp_s1
SELECT
pjtno
, acntcode = '94'
, mon = SUBSTRING(apvdate,5,2)
, slpamt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '94%'
AND saupbu = @saupbu
AND area = @area
-- AND apvdate >= @frdate
AND apvdate = @todate
-- AND pjtno = 'AA'
AND (pjtno = 'AA' OR pjtno IN (select pjtno_slip from ACC.dbo.t23w50 where yy = substring(@frdate,1,4) and pjtno_rep = 'AA'))
GROUP BY
pjtno, SUBSTRING(apvdate,5,2)
/* 간접비 합계 ------------------------------------------------
SELECT pjtno, acntcode, mon, amt=ISNULL(SUM(slpamt),0)
into #temp_s3
FROM @temp_s1
group by pjtno, acntcode, mon
*/
/************************************************************************/
/* 간접비 배부 ------------------------------------------------*/
/************************************************************************/
DECLARE @chk_baebu_yn1 char(1),@chk_baebu_yn2 char(1),@chk_baebu_yn3 char(1),@chk_baebu_yn4 char(1)
SELECT @chk_baebu_yn1 = cd_name4 FROM ACC.dbo.t23c90 WHERE group_code = '05' AND sub_code = '1'
SELECT @chk_baebu_yn2 = cd_name4 FROM ACC.dbo.t23c90 WHERE group_code = '05' AND sub_code = '2'
SELECT @chk_baebu_yn3 = cd_name4 FROM ACC.dbo.t23c90 WHERE group_code = '05' AND sub_code = '3'
SELECT @chk_baebu_yn4 = cd_name4 FROM ACC.dbo.t23c90 WHERE group_code = '05' AND sub_code = '4'
/* 직접비 합 구함 :::: 프로젝트별 월별 계정별 합계 */
/* 간접비 배부기준에 따라서 직접비 합이 틀려진다. 간접비배부에 해당하는 계정에 대한 합(A)을 구한다.*/
/* 간접비 배부에 해당하는 프로젝트별 합(B)을 구해서 B/A*100을 하면 비율이 구해진다.*/
/*
SELECT pjtno, month
, SUM(case when acntcode like '91%' then amt else 0 end) tot1
, SUM(case when acntcode like '92%' then amt else 0 end) tot2
, SUM(case when acntcode like '93%' then amt else 0 end) tot3
, SUM(case when acntcode like '94%' then amt else 0 end) tot4
, rate=convert(decimal(20,13),0)
into @totamt1
FROM ACC.dbo.t23w20
WHERE area=@area
AND saupbu=@saupbu
AND indi = '1' --직접비기준
AND gijun = '1' --공사진행율기준
GROUP BY pjtno, month
*/
-- SELECT * FROM @temp_s1
-- SELECT SUM(slpamt) FROM @temp_s1 GROUP BY SUBSTRING(acntcode,1,2)
-- SELECT * FROM @totamt1 ORDER BY acntcode, pjtno
-- SELECT * FROM @totamt2 ORDER BY pjtno, acntcode
-- 이거는 사용 안해도 될듯...
DECLARE @totamt1 TABLE
(
pjtno VARCHAR(10),
acntcode VARCHAR(7),
[month] VARCHAR(2),
totamt DECIMAL,
rate DECIMAL(20,13)
)
INSERT INTO
@totamt1
SELECT
pjtno, acntcode, [month], totamt=SUM(amt), rate=0
FROM
ACC.dbo.t23w20
WHERE
yy = @yy
AND indi = '1' --직접비기준
AND gijun = '1' --공사진행율기준
GROUP BY
pjtno, acntcode, [month]
ORDER BY
acntcode
-- 이거는 일단 간접비 배부기준을 92, 93으로 셋팅함 원래는 테이블에서 가져와야 하는데...처리 안됨
DECLARE @totamt2 TABLE
(
pjtno VARCHAR(10),
[month] VARCHAR(2),
totamt DECIMAL,
amt92 DECIMAL,
amt93 DECIMAL,
rate DECIMAL(20,13)
)
INSERT INTO
@totamt2
SELECT
pjtno, [month]
-- , totamt = (SUM(CASE WHEN acntcode like '92%' THEN amt ELSE 0 END)+SUM(CASE WHEN acntcode like '93%' THEN amt ELSE 0 END))
, totamt = case
when @todate < '20130531'
then
(SUM(CASE WHEN acntcode like '92%' THEN amt ELSE 0 END)+SUM(CASE WHEN acntcode like '93%' THEN amt ELSE 0 END))
else
(SUM(CASE WHEN acntcode like '92%' THEN (case when amt>0 then amt else 0 end) ELSE 0 END)+SUM(CASE WHEN acntcode like '93%' THEN (case when amt>0 then amt else 0 end) ELSE 0 END))
end
, amt92 = SUM(CASE WHEN acntcode like '92%' THEN amt ELSE 0 END)
, amt93 = SUM(CASE WHEN acntcode like '93%' THEN amt ELSE 0 END)
, rate=CONVERT(DECIMAL(20,13),0)
FROM
ACC.dbo.t23w20
WHERE
yy = @yy
AND indi = '1' --직접비기준
AND gijun = '1' --공사진행율기준
GROUP BY pjtno, [month]
/* pjt별 배부율 할당계산 */
UPDATE
@totamt2
SET
rate = CONVERT(DECIMAL(20,13), (a.totamt/b.total))
FROM
@totamt2 a
INNER JOIN
(
SELECT
[month]
, total = SUM(totamt)
FROM
@totamt2
GROUP BY
[month]
) b
on a.[month] = b.[month]
-- 감가상각비, 퇴충에 대해서 처리
DECLARE @totamt3 TABLE
(
pjtno VARCHAR(10),
[month] VARCHAR(2),
totamt DECIMAL,
amt92 DECIMAL,
amt93 DECIMAL,
rate DECIMAL(20,13)
)
INSERT INTO
@totamt3
SELECT
pjtno
, [month] = SUBSTRING(@todate,5,2)
-- , [month] = [month]
-- , totamt = (SUM(CASE WHEN acntcode like '92%' THEN amt ELSE 0 END)+SUM(CASE WHEN acntcode like '93%' THEN amt ELSE 0 END))
, totamt = case
when @todate < '20130531'
then
(SUM(CASE WHEN acntcode like '92%' THEN amt ELSE 0 END)+SUM(CASE WHEN acntcode like '93%' THEN amt ELSE 0 END))
else
(SUM(CASE WHEN acntcode like '92%' THEN (case when amt>0 then amt else 0 end) ELSE 0 END)+SUM(CASE WHEN acntcode like '93%' THEN (case when amt>0 then amt else 0 end) ELSE 0 END))
end
, amt92 = SUM(CASE WHEN acntcode like '92%' THEN amt ELSE 0 END)
, amt93 = SUM(CASE WHEN acntcode like '93%' THEN amt ELSE 0 END)
, rate=CONVERT(DECIMAL(20,13),0)
FROM
ACC.dbo.t23w20
WHERE
yy = @yy
AND indi = '1' --직접비기준
AND gijun = '1' --공사진행율기준
GROUP BY pjtno
-- , [month]
/* pjt별 배부율 할당계산 */
UPDATE
@totamt3
SET
rate = CONVERT(DECIMAL(20,13), (totamt/(SELECT totamt=SUM(totamt) FROM @totamt3)))
SELECT * FROM @totamt1
SELECT * FROM @totamt2 order by pjtno
SELECT * FROM @totamt3 order by pjtno
SELECT * FROM @temp_s1 order by pjtno
SELECT substring(acntcode,1,2) acntcode, mon, sum(slpamt) slpamt FROM @temp_s1 group by substring(acntcode,1,2), mon
SELECT * FROM ACC.dbo.t23w20 where yy = @yy
/* 재료,노무,경비,외주 간접비 배부 ---------------------------------*/
/* 직접비 구성대로 간접비 구성 */
/*
SELECT * ,convert(decimal(20,0),round((a.rate*b.slpamt),0))
FROM @totamt1 a inner join @temp_s1 b on a.acntcode = b.acntcode AND a.month = b.mon
WHERE b.acntcode like '93%'
*/
-- 간접비를 직접재료비에 배부시킨다. Y일 때만
if (@chk_baebu_yn1 = 'Y')
BEGIN
INSERT INTO
ACC.dbo.t23w20
(yy, pjtno, acntcode, indi, [month]
, amt
, rate, gijun)
SELECT
@yy, a.pjtno, '91', '2', a.[month]
, amt = CONVERT(DECIMAL(20,0), ROUND((a.rate*b.slpamt),0))
, 0, '1'
FROM
@totamt1 a
INNER JOIN
@temp_s1 b
ON
a.acntcode = b.acntcode
AND a.[month] = b.mon
WHERE
b.acntcode ='91'
END
-- SELECT SUM(amt) FROM t23w20 WHERE indi = '2' GROUP BY SUBSTRING(acntcode,1,2)
-- SELECT * FROM t23w20 WHERE indi = '2' AND acntcode like '92%'
/* SELECT a.pjtno, b.acntcode, '2', a.month
, a.rate, b.slpamt
FROM @totamt2 a inner join @temp_s1 b
on a.month = b.mon
WHERE b.acntcode like '93%'
*/
-- 간접비를 직접노무비에 배부시킨다. Y일 때만
if (@chk_baebu_yn2 = 'Y')
BEGIN
INSERT INTO
ACC.dbo.t23w20
(yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
SELECT
@yy, a.pjtno, b.acntcode, '2', a.[month]
, amt = SUM(ROUND((a.rate*b.slpamt),0))
, 0, '1'
FROM
@totamt2 a
INNER JOIN
@temp_s1 b
ON
a.[month] = b.mon
WHERE
b.acntcode LIKE '92%'
AND b.acntcode NOT IN ('9200400' ,'9200401' ,'9200402','9200403')
GROUP BY
a.pjtno, b.acntcode, a.[month]
SELECT
@yy, a.pjtno, b.acntcode, '2', a.[month]
, amt = SUM(ROUND((a.rate*b.slpamt),0))
, rate = SUM(a.rate)
, slpamt = SUM(b.slpamt)
, 0, '1'
FROM
@totamt2 a
INNER JOIN
@temp_s1 b
ON
a.[month] = b.mon
WHERE
b.acntcode LIKE '92%'
AND b.acntcode NOT IN ('9200400' ,'9200401' ,'9200402','9200403')
GROUP BY
a.pjtno, b.acntcode, a.[month]
INSERT INTO
ACC.dbo.t23w20
(yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
SELECT
@yy, a.pjtno, b.acntcode, '2', a.[month]
, amt = SUM(ROUND((a.rate*b.slpamt),0))
, 0, '1'
FROM
@totamt3 a
INNER JOIN
@temp_s1 b
ON
a.[month] = b.mon
WHERE
b.acntcode IN ('9200400' ,'9200401' ,'9200402','9200403')
GROUP BY
a.pjtno, b.acntcode, a.[month]
END
-- 간접비를 직접경비에 배부시킨다. Y일 때만
if (@chk_baebu_yn3 = 'Y')
BEGIN
IF (@todate < '20130531') -- (SUBSTRING(@todate,5,4) = '0531')
BEGIN
INSERT INTO
ACC.dbo.t23w20
(yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
SELECT
@yy, a.pjtno, b.acntcode, '2', a.[month]
, amt = SUM(ROUND((a.rate*b.slpamt),0))
, 0, '1'
FROM
@totamt2 a
INNER JOIN
@temp_s1 b
ON
a.[month] = b.mon
WHERE
b.acntcode LIKE '93%'
GROUP BY
a.pjtno, b.acntcode, a.[month]
END
ELSE
BEGIN
INSERT INTO
ACC.dbo.t23w20
(yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
SELECT
@yy, a.pjtno, b.acntcode, '2', a.[month]
, amt = SUM(ROUND((a.rate*b.slpamt),0))
, 0, '1'
FROM
@totamt2 a
INNER JOIN
@temp_s1 b
ON
a.[month] = b.mon
WHERE
b.acntcode LIKE '93%'
AND b.acntcode NOT IN ('9303900' ,'9303901' ,'9303902','9303903','9303904','9303905','9303906','9303907','9303908')
GROUP BY
a.pjtno, b.acntcode, a.[month]
INSERT INTO
ACC.dbo.t23w20
(yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
SELECT
@yy, a.pjtno, b.acntcode, '2', a.[month]
, amt = SUM(ROUND((a.rate*b.slpamt),0))
, 0, '1'
FROM
@totamt3 a
INNER JOIN
@temp_s1 b
ON
a.[month] = b.mon
WHERE
b.acntcode IN ('9303900' ,'9303901' ,'9303902','9303903','9303904','9303905','9303906','9303907','9303908')
GROUP BY
a.pjtno, b.acntcode, a.[month]
END
-- INSERT INTO
-- ACC.dbo.t23w20
-- (yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
-- SELECT
-- @yy, a.pjtno, b.acntcode, '2', a.[month]
-- , amt = SUM(ROUND((a.rate*b.slpamt),0))
-- , 0, '1'
-- FROM
-- @totamt2 a
-- INNER JOIN
-- @temp_s1 b
-- ON
-- a.[month] = b.mon
-- WHERE
-- b.acntcode LIKE '93%'
-- AND b.acntcode NOT IN ('9303900' ,'9303901' ,'9303902','9303903','9303904','9303905','9303906','9303907','9303908')
-- GROUP BY
-- a.pjtno, b.acntcode, a.[month]
--
-- INSERT INTO
-- ACC.dbo.t23w20
-- (yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
-- SELECT
-- @yy, a.pjtno, b.acntcode, '2', a.[month]
-- , amt = SUM(ROUND((a.rate*b.slpamt),0))
-- , 0, '1'
-- FROM
-- @totamt3 a
-- INNER JOIN
-- @temp_s1 b
-- ON
-- a.[month] = b.mon
-- WHERE
-- b.acntcode IN ('9303900' ,'9303901' ,'9303902','9303903','9303904','9303905','9303906','9303907','9303908')
-- GROUP BY
-- a.pjtno, b.acntcode, a.[month]
END
-- 간접비를 직접외주비에 배부시킨다. Y일 때만
if (@chk_baebu_yn4 = 'Y')
BEGIN
INSERT INTO
ACC.dbo.t23w20
(yy, pjtno, acntcode, indi, [month], amt, rate, gijun)
SELECT
@yy, a.pjtno, '94', '2', a.[month]
, amt = CONVERT(DECIMAL(20,0),ROUND((a.rate*b.slpamt),0)), 0, '1'
FROM
@totamt1 a
INNER JOIN
@temp_s1 b
ON
a.[month] = b.mon
WHERE
b.acntcode LIKE '94%'
END
/*=== 간접비인 경우에 승인전표에서 계정코드가 '5130100' 이 당기 기간의 매출액이 되므로 해당 매출액을 입력한다. */
DECLARE @temp_saleamt TABLE
(
pjtno VARCHAR(10),
saleamt DECIMAL
)
INSERT INTO
@temp_saleamt
SELECT
a.pjtno,
saleamt = SUM(a.apvcramt)
FROM
(
SELECT
a.pjtno,
a.apvcramt
FROM
#temp_t23a10 a
INNER JOIN
(
SELECT DISTINCT a.pjtno
FROM
(
SELECT
distinct c.pjtno_slip pjtno
FROM
ACC.dbo.t23w60 a
JOIN
ACC.dbo.t23w50 c
ON
a.yy = c.yy and a.pjtno = c.pjtno_rep
WHERE
a.yy = @yy
AND a.hg_gijun ='2'
UNION
SELECT
distinct a.pjtno
FROM
ACC.dbo.t23w60 a
WHERE
NOT EXISTS
(
SELECT * FROM ACC.dbo.t23w50
WHERE
a.yy = yy and a.pjtno = pjtno_slip
)
AND a.yy = @yy
AND a.hg_gijun ='2'
) a
) b
ON
a.pjtno = b.pjtno
WHERE
a.apvdate BETWEEN @frdate AND @todate
AND a.acntcode = '5130100'
UNION ALL
SELECT
a.pjtno,
a.apvcramt
FROM
ACC.dbo.t23a90 a
INNER JOIN
(
SELECT DISTINCT a.pjtno
FROM
(
SELECT
distinct c.pjtno_slip pjtno
FROM
ACC.dbo.t23w60 a
JOIN
ACC.dbo.t23w50 c
ON
a.yy = c.yy and a.pjtno = c.pjtno_rep
WHERE
a.yy = @yy
AND a.hg_gijun ='2'
UNION
SELECT
distinct a.pjtno
FROM
ACC.dbo.t23w60 a
WHERE
NOT EXISTS
(
SELECT * FROM ACC.dbo.t23w50
WHERE
a.yy = yy and a.pjtno = pjtno_slip
)
AND a.yy = @yy
AND a.hg_gijun ='2'
) a
) b
ON
a.pjtno = b.pjtno
WHERE
-- a.apvdate BETWEEN @frdate AND @todate 2010.06.16 수정
a.apvdate = @todate
AND a.acntcode = '5130100'
) a
GROUP BY
a.pjtno
/*=== 직접비인 경우에 승인전표에서 계정코드가 '2100601','2100602'이고, 사업자번호가 '4118121029'이 아닌 대변금액이 당기 기간의 수금액이 되므로 */
INSERT INTO
@temp_saleamt
SELECT
a.pjtno,
saleamt = SUM(a.apvcramt)
FROM
#temp_t23a10 a
INNER JOIN
(
-- SELECT DISTINCT a.pjtno
-- FROM
-- @temp_s2 a
-- WHERE
-- a.yy = @yy
-- AND a.hg_gijun = '1'
SELECT DISTINCT a.pjtno
FROM
(
SELECT
distinct c.pjtno_slip pjtno
FROM
ACC.dbo.t23w60 a
JOIN
ACC.dbo.t23w50 c
ON
a.yy = c.yy and a.pjtno = c.pjtno_rep
WHERE
a.yy = @yy
AND a.hg_gijun ='1'
UNION
SELECT
distinct a.pjtno
FROM
ACC.dbo.t23w60 a
WHERE
NOT EXISTS
(
SELECT * FROM ACC.dbo.t23w50
WHERE
a.yy = yy and a.pjtno = pjtno_slip
)
AND a.yy = @yy
AND a.hg_gijun ='1'
) a
) b
ON
a.pjtno = b.pjtno
WHERE
a.apvdate BETWEEN substring(@frdate,1,7)+'2' AND @todate
AND a.acntcode in ('2100601','2100602')
AND a.vendorcd <> '4118121029'
GROUP BY
a.pjtno
/* 전표등록된 공사코드 ---> 원가계산용 공사코드로 변경 */
UPDATE
@temp_saleamt
SET
pjtno = b.pjtno_rep
FROM
@temp_saleamt a,
ACC.dbo.t23w50 b
WHERE
b.yy = substring(@frdate,1,4) and a.pjtno = b.pjtno_slip
/* 원가계산에 있는 경우에는 업데이트하고 해당 기간에 없는 경우에는 신규로 입력한다.*/
UPDATE
ACC.dbo.t23w20
SET
saleamt = b.saleamt
FROM
ACC.dbo.t23w20 a
INNER JOIN
(
SELECT pjtno, SUM(saleamt) saleamt FROM @temp_saleamt
GROUP BY pjtno
) b
ON
a.yy = @yy
AND a.pjtno = b.pjtno
INSERT INTO
ACC.dbo.t23w20
(
yy, pjtno, amt, rate, indi, acntcode, [month]
, gijun
, saleamt
)
SELECT
@yy, a.pjtno, 0, 0, '', '', ''
, (SELECT hg_gijun FROM ACC.dbo.t23w60 WHERE yy = @yy AND pjtno = a.pjtno)
, SUM(a.saleamt) saleamt
FROM
@temp_saleamt a
WHERE NOT EXISTS
(
SELECT DISTINCT pjtno FROM ACC.dbo.t23w20 WHERE yy = @yy AND a.pjtno = pjtno
)
GROUP BY
a.pjtno
-- 해당 기간에 발생되지 않은 자료를 강제로 보여주기 위해서 추가함.
INSERT INTO
ACC.dbo.t23w20
(
yy, pjtno, amt, rate, indi, acntcode, [month]
, gijun
, saleamt
)
SELECT
@yy, a.pjtno, 0, 0, '', '', ''
, a.hg_gijun
, 0
FROM
ACC.dbo.t23w60 a
WHERE NOT EXISTS
(
SELECT DISTINCT pjtno FROM ACC.dbo.t23w20 WHERE yy = @yy AND a.pjtno = pjtno
)
AND a.yy = @yy
/*=== 공사진행율기준의 경우에 선수금을 가져오기 위해서 추가 */
UPDATE
ACC.dbo.t23w20
SET
sunsugum = b.sunsugum
FROM
ACC.dbo.t23w20 a
INNER JOIN
(
SELECT
a.pjtno, SUM(a.apvcramt) - SUM(a.apvdramt) sunsugum -- 대변 - 차변
FROM
#temp_t23a10 a
INNER JOIN
(
SELECT pjtno FROM ACC.dbo.t23w20 WHERE yy = @yy AND gijun ='1' GROUP BY pjtno
) b
ON
a.pjtno = b.pjtno
WHERE
a.apvdate BETWEEN @frdate AND @todate
AND a.acntcode in ('2100601','2100602')
GROUP BY
a.pjtno
) b
ON
a.yy = @yy
AND a.pjtno = b.pjtno
-- 노무비 차액 발생하는 것 체크해서 월별로 가장 큰 계정의 금액에 더하거나 뺀다.
DECLARE @tmpjan92 TABLE
(
seq INT IDENTITY(1,1),
mon CHAR(2),
amt DECIMAL
)
DECLARE @seq INT, @cnt INT, @janamt DECIMAL
SET @seq = 1
SET @cnt = 0
SET @janamt = 0
INSERT INTO
@tmpjan92
SELECT
a.mon, b.amt-a.amt
FROM
(
SELECT mon = [month], sum(amt) amt
FROM
ACC.dbo.t23w20
WHERE
yy = @yy
and acntcode like '92%'
GROUP BY
[month]
) a
JOIN
(
SELECT
mon, SUM(amt) amt
FROM
(
SELECT
mon = SUBSTRING(apvdate,5,2)
, amt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '92%'
AND saupbu = @saupbu
AND area = @area
AND apvdate >= @frdate
AND apvdate <= @todate
GROUP BY
SUBSTRING(apvdate,5,2)
UNION ALL
SELECT
mon = SUBSTRING(apvdate,5,2)
, amt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '92%'
AND saupbu = @saupbu
AND area = @area
-- AND apvdate >= @frdate
AND apvdate = @todate
GROUP BY
SUBSTRING(apvdate,5,2)
) a
GROUP BY
mon
) b
ON
a.mon = b.mon
-- SELECT * FROM @tmpjan92
SELECT @cnt = COUNT(*)
FROM @tmpjan92
WHILE(@seq<=@cnt)
BEGIN
SELECT @janamt = amt FROM @tmpjan92 WHERE seq = @seq
UPDATE
ACC.dbo.t23w20
SET
amt = amt + @janamt
FROM
ACC.dbo.t23w20 a
JOIN
(
SELECT TOP 1 pjtno, [month], acntcode
FROM
ACC.dbo.t23w20
WHERE
yy = @yy
AND [month] = HRM.dbo.ufn_lpad(@seq, 2, '0')
AND acntcode LIKE '92%'
AND indi = '2' -- 간접비에 배부해야 함
GROUP BY
pjtno, [month], acntcode
ORDER BY
MAX(amt) DESC
) b
ON
a.yy = @yy
AND a.[month] = b.[month]
AND a.pjtno = b.pjtno
AND a.acntcode = b.acntcode
AND a.indi = '2' -- 간접비에 배부해야 함
SET @seq = @seq + 1
END
-- 경비 차액 발생하는 것 체크해서 월별로 가장 큰 계정의 금액에 더하거나 뺀다.
DECLARE @tmpjan93 TABLE
(
seq INT IDENTITY(1,1),
mon CHAR(2),
amt DECIMAL
)
INSERT INTO
@tmpjan93
SELECT
a.mon, b.amt-a.amt
FROM
(
SELECT mon = [month], sum(amt) amt
FROM
ACC.dbo.t23w20
WHERE
yy = @yy
AND acntcode LIKE '93%'
GROUP BY
[month]
) a
JOIN
(
SELECT
mon, SUM(amt) amt
FROM
(
SELECT
mon = SUBSTRING(apvdate,5,2)
, amt = SUM(apvdramt)
FROM
#temp_t23a10
WHERE
acntcode LIKE '93%'
AND saupbu = @saupbu
AND area = @area
AND apvdate >= @frdate
AND apvdate <= @todate
GROUP BY
SUBSTRING(apvdate,5,2)
UNION ALL
SELECT
mon = SUBSTRING(apvdate,5,2)
, amt = SUM(apvdramt)
FROM
ACC.dbo.t23a90
WHERE
acntcode LIKE '93%'
AND saupbu = @saupbu
AND area = @area
-- AND apvdate >= @frdate
AND apvdate = @todate
GROUP BY
SUBSTRING(apvdate,5,2)
) a
GROUP BY
mon
) b
ON
a.mon = b.mon
ORDER BY
a.mon
-- SELECT * FROM @tmpjan93
SET @seq = 1
SET @cnt = 0
SET @janamt = 0
SELECT @cnt = COUNT(*)
FROM @tmpjan93
WHILE(@seq<=@cnt)
BEGIN
SELECT @janamt = amt FROM @tmpjan93 WHERE seq = @seq
-- SELECT @janamt
UPDATE
ACC.dbo.t23w20
SET
amt = amt + @janamt
FROM
ACC.dbo.t23w20 a
JOIN
(
SELECT TOP 1 pjtno, [month], acntcode
FROM
ACC.dbo.t23w20
WHERE
yy = @yy
AND [month] = HRM.dbo.ufn_lpad(@seq, 2, '0')
AND acntcode LIKE '93%'
AND indi = '2' -- 간접비에 배부해야 함
GROUP BY
pjtno, [month], acntcode
ORDER BY
MAX(amt) DESC
) b
ON
a.yy = @yy
AND a.[month] = b.[month]
AND a.pjtno = b.pjtno
AND a.acntcode = b.acntcode
AND indi = '2' -- 간접비에 배부해야 함
SET @seq = @seq + 1
END