월 비용
2013-01 50,000
2013-02 40,000
2013-03 56,000
2013-04 98,000
...
으로 값이 들어가 있을 경우
2013-02-04 ~ 2013-03-21 비용을 계산을 하려고 하는데요.
40,000 / 28 * 24 + 56,000 / 31 * 21 로 계산을 하려고 합니다.
2013-01-04 ~ 2013-04-21 의 경우
50,000 / 31 * 26 + 40,000 /28 * 28 + 56,000 / 31 * 31 + 98,000 / 30 * 21
로 계산의 결과가 나타나도록 하고 싶은데...
이게 쿼리 문으로 가능 할까요?
아니면 이걸 일로 ... 쭉 쪼갠 다음...
Select ... 를 했을 경우.... 아래 처럼 일자로 쭉 쪼개져 나오고... 구간 검색을 해서 sum을 하는 방법... 즉 쪼개는 쿼리가 있을까요?
2013-01-01 xxx
2013-01-03 xxx
2013-01-04 xxx
2013-01-05 xxx
Comment 2
-
쓸만한게없네(윤선식)
2013.05.04 14:35
-
minsouk
2013.05.07 00:10
간단하게 만들어 본 거요. 물론 머리 좀 더 쓰면 이렇게 만들겠지만.
원리는 이렇습니다.
1. DATETIME 넣는 테이블 만듭니다. (날짜계산용)
2. 월별 금액 근거 테이블 만듭니다.
3. 두 테이블을 조인해서 한 달이 얼마인지 가져오고, 실제 일자가 얼마인지 확인하여 계산합니다.
use tempdb
GO
-- dbo.TB_DATE
CREATE TABLE dbo.TB_DATE
(
YMD SMALLDATETIME NOT NULL
)
;
ALTER TABLE dbo.TB_DATE
ADD CONSTRAINT PK_TB_DATE PRIMARY KEY CLUSTERED
(YMD)
;
--------------
DECLARE @I INT, @TOT INT, @DT SMALLDATETIME;
SET @I = 1;
SET @TOT = 365 * 10;
SET @DT = '2012-01-01';
WHILE @I < @TOT
BEGIN
INSERT INTO dbo.TB_DATE VALUES (@DT);
SET @DT = DATEADD(D,1,@DT);
SET @I = @I + 1;
END
--------------
SELECT * FROM dbo.TB_DATE
--DROP TABLE dbo.TB_DEFINE
CREATE TABLE dbo.TB_DEFINE
(
YM SMALLDATETIME NOT NULL,
COST INT NOT NULL
)
;
ALTER TABLE dbo.TB_DEFINE
ADD CONSTRAINT PK_TB_DEFINE PRIMARY KEY CLUSTERED
(YM)
INSERT INTO dbo.TB_DEFINE (YM, COST) VALUES
('2012-01-01',50000),
('2012-02-01',40000),
('2012-03-01',56000),
('2012-04-01',98000)
;
-- SELECT * FROM TB_DEFINE
SELECT A.YM, B.TOTAL_DAY, A.COST, C.DD, A.COST / B.TOTAL_DAY * C.DD AS COSTS
FROM dbo.TB_DEFINE A
JOIN
(
SELECT CONVERT(SMALLDATETIME,CONVERT(CHAR(6),YMD, 112) + '01') AS YM, COUNT(*) AS TOTAL_DAY
FROM dbo.TB_DATE A
GROUP BY CONVERT(CHAR(6),YMD, 112)
) B ON A.YM = B.YM
JOIN
(
SELECT CONVERT(SMALLDATETIME,CONVERT(CHAR(6),YMD, 112) + '01') AS YM, COUNT(*) AS DD
FROM dbo.TB_DATE A
WHERE YMD >= '20120204' AND YMD <= '20120321'
GROUP BY CONVERT(CHAR(6),YMD, 112)
) C ON A.YM = C.YM