01/01/2007부터 2011/12/31까지 내 제품의 단가는 원래 단가가 얼마 든간에 고정됩니다. unit price*1.02
해야 2012년 9월 11일에 대한 있도록 2015년 12월 31일에 01/01/2012에서 은 단가가 2 % 매년 증가되고, 2013년 9월 11일는해야 (unit price*1.02)*1.02
SQL 2008 : 매년 고정 가격이 지수 기하 급수적으로 증가합니다.
내 제품 테이블 PRODUCT_T에 Product_ID 및 Unit_Price와 같은 정보가 있습니다. 내가 지수 단가를 저장하는 다른 열 또는 다른 테이블을 작성해야하는 경우
CREATE TABLE PRODUCT_TIMESTAMP_T
(
PRODUCT_ID INT,
START_VALID_DATE DATE,
END_VALID_DATE DATE,
START_EXPONENTIAL_DATE DATE,
END_EXPONENTIAL_DATE DATE,
CUSTOM_DATE DATE,
UNIT_PRICE DECIMAL (13,4)
);
ALTER TABLE PRODUCT_TIMESTAMP_T ADD FOREIGN KEY (PRODUCT_ID) REFERENCES PRODUCT_T.PRODUCT_ID
INSERT INTO PRODUCT_TIMESTAMP_T (PRODUCT_ID)
VALUES (1),(2),(3),(4)
UPDATE PRODUCT_TIMESTAMP_T
SET START_VALID_DATE = '2007-01-01'
UPDATE PRODUCT_TIMESTAMP_T
SET END_VALID_DATE = '2011-12-31'
UPDATE PRODUCT_TIMESTAMP_T
SET START_EXPONENTIAL_DATE = '2012-01-01'
UPDATE PRODUCT_TIMESTAMP_T
SET END_EXPONENTIAL_DATE = '2015-12-31'
UPDATE PRODUCT_TIMESTAMP_T
SET PRODUCT_T.UNIT_PRICE = PRODUCT_TIMESTAMP_T.UNIT_PRICE
WHERE CUSTOM_DATE < START_EXPONENTIAL_DATE
UPDATE PRODUCT_TIMESTAMP_T
SET REAL_PRICE = UNIT_PRICE*1.02
WHERE CUSTOM_DATE < '2013-01-01'`
내 주요 오류, 또는 나는 경우 다른 문을 사용 할 수 있습니다 경우 유지 :
지금까지 내가 가진 단가를 저장하는 단 하나의 열. 위 코드의 문제점은 두 테이블을 한 번에 업데이트 할 수 없다는 것입니다. (두 테이블을 업데이트하는 방법을 찾았지만이 문제를 마무리하는 데는 아직 가깝지 않습니다.)
내가 필요한지 잘 모르겠습니다. 이것을 위해 트리거/프로 시저를 사용하거나 다른 방법으로 해결할 수있는 경우.
*UPDATE 03/13/2014 1:14 AM
PRODUCT_ID PRODUCT_DESCRIPTION UNIT_PRICE (no column name)
1 Cleaner 4.99 5.089800
2 Fire 3.99 4.149600
3 Water 7.99 8.469400
내가 더 열 이름을 추측하고는? 그러나 저는 CREATE FUNCTIONS를 전혀 사용하지 않았습니다. 그래서이 모든 것이 무엇을 의미하는지 알아 내려고합니다. 또한 항목 없음의 숫자가 첫 번째 제품 (클리너)에 1.02, 불에 1.04, 물에 1.06을 곱한 값입니다. 내가 원했던 것은 모든 것에 대해 1.02이지만 맞춤 날짜의 값을 어디에 설정 했는지도 알지 못했습니다. 내 것은 2012-09-11이므로 배율 1.02이어야합니다.
그리고 이것은 원본에서 업데이트 한 코드입니다. 여기에 모든 것이 필요한지 확실하지 않았습니다. 당신은 다음 computed column 또는 단순히 업데이트 문에서 출력을 사용할 수 있습니다 -
CREATE TABLE PRODUCT_TIMESTAMP_T
(
PRODUCT_ID INT,
START_VALID_DATE DATE,
END_VALID_DATE DATE,
START_EXPONENTIAL_DATE DATE,
END_EXPONENTIAL_DATE DATE,
CUSTOM_DATE DATE,
UNIT_PRICE DECIMAL (13,4)
);
INSERT INTO PRODUCT_TIMESTAMP_T (PRODUCT_ID)
VALUES (1),(2),(3),(4)
UPDATE PRODUCT_TIMESTAMP_T
SET START_VALID_DATE = '2007-01-01'
UPDATE PRODUCT_TIMESTAMP_T
SET END_VALID_DATE = '2011-12-31'
UPDATE PRODUCT_TIMESTAMP_T
SET START_EXPONENTIAL_DATE = '2012-01-01'
UPDATE PRODUCT_TIMESTAMP_T
SET END_EXPONENTIAL_DATE = '2015-12-31'
GO
CREATE FUNCTION dbo.RealPrice
(@START_EXPONENTIAL_DATE date,
@CUSTOM_DATE date,
@START_UNIT_PRICE DECIMAL (13,4),
@ANNUAL_INCREASE DECIMAL (13,4))
RETURNS DECIMAL (13,4)
AS BEGIN
DECLARE @CALCULATED_UNIT_PRICE DECIMAL (13,4)
IF @CUSTOM_DATE < @START_EXPONENTIAL_DATE RETURN @START_UNIT_PRICE
SET @CALCULATED_UNIT_PRICE = @START_UNIT_PRICE * POWER(@ANNUAL_INCREASE , DATEDIFF(YY,@START_EXPONENTIAL_DATE,@CUSTOM_DATE)+1)
RETURN @CALCULATED_UNIT_PRICE
END
GO
SELECT dbo.RealPrice('2012-01-01','9/11/2012',10,1.02) AS REAL_PRICE
UPDATE PRODUCT_TIMESTAMP_T
SET UNIT_PRICE = 1,CUSTOM_DATE = DATEADD(yy,PRODUCT_ID-1,START_EXPONENTIAL_DATE)
SELECT PRODUCT_T.PRODUCT_ID,
PRODUCT_DESCRIPTION,
PRODUCT_T.UNIT_PRICE
,CASE WHEN START_EXPONENTIAL_DATE < START_VALID_DATE THEN PRODUCT_T.UNIT_PRICE
ELSE PRODUCT_T.UNIT_PRICE * POWER(1.02 , DATEDIFF(YY,START_EXPONENTIAL_DATE,CUSTOM_DATE)+1) END
FROM PRODUCT_TIMESTAMP_T, PRODUCT_T
WHERE PRODUCT_T.PRODUCT_ID = PRODUCT_TIMESTAMP_T.PRODUCT_ID
AND PRODUCT_T.UNIT_PRICE IS NOT NULL
정확한 대문자 사용으로 게시물을 다시 포맷하는 것이 좋습니다. 읽을 수 없습니다. – attila