2014-03-13 2 views
0

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.02SQL 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

정말 도움이되었다고 감사합니다,하지만 난 여전히 해결해야 할 몇 가지 작은 오류가 있습니다. 필요한 최종 출력물은 제품 ID, 제품 정보 (제품명) 및 단가입니다. 그래서 여기에 나열된 단가 대신 컬럼 이름이없는 단가가 필요합니다. 나는이 모든 실행 결과 : 나는 dbo.RealPrice의 별칭이 없기 때문에

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 
+0

정확한 대문자 사용으로 게시물을 다시 포맷하는 것이 좋습니다. 읽을 수 없습니다. – attila

답변

0

나는 그러나 내가이 문제를 해결하기 위해 POWER 함수를 사용하는 거라고, 당신의 예를 여기에 게시 간소화되었습니다 얼마나 잘 모르겠어요 . 나는 일반적인 경우 설명 할 수있는 기능을 만들었습니다,이 논리는 아마 this potential performance issue을 상쇄하는 데 도움이 기능없이 계산 된 열 정의에 사용할 수있을만큼 간단 할 수

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 -- Otherwise we can get calculated deflation 
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/2013',10,1.02) 

참고,하지만 난 그것을 포함 당신이 그것을 선택할 수있는 많은 장소가있는 기능입니다. 또는 성능을 향상 시키려면이 값을 테이블 반환 함수 또는 뷰로 변환 할 수 있습니다. 우리는 테이블에 몇 가지 추가 값을 추가하는 경우

select 문에 간단한 예제를 실행할 수 있습니다

UPDATE PRODUCT_TIMESTAMP_T 
SET UNIT_PRICE = 1,CUSTOM_DATE = DATEADD(yy,PRODUCT_ID-1,START_EXPONENTIAL_DATE) 

SELECT PRODUCT_ID , 
     START_VALID_DATE , 
     END_VALID_DATE , 
     START_EXPONENTIAL_DATE , 
     END_EXPONENTIAL_DATE , 
     CUSTOM_DATE , 
     UNIT_PRICE 
,CASE WHEN START_EXPONENTIAL_DATE < START_VALID_DATE THEN UNIT_PRICE 
ELSE UNIT_PRICE * POWER(1.02 , DATEDIFF(YY,START_EXPONENTIAL_DATE,CUSTOM_DATE)+1) END 
FROM PRODUCT_TIMESTAMP_T 

그래서 당신은 단순히 POWER와 답을 계산하기 위해 CASE 문을 사용하고 볼 수 있으며, DATEDIFF, 정적 값 1.02 (정적 인 경우 또는 다른 곳에서 가져와야하는 경우 확실하지 않음)을 사용했습니다.

+0

예 1.02 정적이며 몇 가지 작은 오류로 내 질문을 업데이트했습니다. – Selectful

+0

사용자 지정 날짜는 테이블의 필드입니다. 그러나 사용 된 업데이트 문은 점을 증명하기 위해 다르게 설정합니다. 내 업데이트 문을 당신을 위해 작동하는 것으로 바꾸면 원하는 결과를 볼 수 있습니다. 나는 또한 함수와 그것을 사용하지 않는 select 문을 모두 가지고 있음을 주목한다. 나는이 일을하는 두 가지 방법을 보여주기 위해 노력했기 때문에 나는 혼란을 믿는다. 그게 분명해? – DaveGreen

+0

예. 작동하도록했습니다! ALIAS를 사용하여 (열 이름 없음) 엔티티를 대체 할 엔티티를 알게됩니까? 나는 그것이 ELSE와 당신이 보여준 두번째 테이블에서 FROM 전에 계산 된 문장이라고 생각했지만, CUSTOM_DATE 이후에 할 때 오류가 난다. +1) – Selectful

관련 문제