2009-12-03 7 views
0

은 내가 제가 기대할 수 있습니다 얼마나 많은 수익을 판별 할 수있는 VIEW입니다 생산 (또는 테이블을 채우는)하고 싶은 무엇SQL에서 수익 예측을 만드는 방법은 무엇입니까?

CREATE TABLE contracts_lines (
    contract_id integer, 
    product_id integer, 
    contract_line_start datetime, 
    contract_line_end datetime, 
    amount float 
) 

의 형태로 계약 된 광고 항목의 목록이있는 테이블이 매월 - 각 라인이 라인 기간 동안 균등하게 인식된다는 간단한 규칙이 있습니다. (예 : daily revenue = amount/(contract_line_end - contract_line_start))

VIEW는 SSAS 큐브에서 측정 값 그룹의 기초로 사용되므로 구조가 있어야합니다 예 :

montly_revenue_forecast (
    year int, 
    month int, 
    product_id int, 
    contract_id int, 
    amount float 
) 

12 개월의 예측을하고 싶습니다. 실행 한 날부터 SSIS를 실행하므로 (루핑 등의) contstructs에 액세스 할 수 있으므로 저장하지 않아도됩니다. 절차.

어떤 도움이 완전한 해결책이 아니다

+0

계약이 향후 시작되도록 설정되어있는 경우 계약 종료일이 있습니까? –

+0

모든 계약에는 언제든지 시작할 수있는 시작일과 종료일이 있습니다. 예 : 오늘 2/1 시작하고 4/15 끝나는 계약을 체결 할 수 있습니다 – DrewM

답변

3

.

시퀀스를 생성하는 가장 편리한 방법과 같이, 오히려 제대로 문서화 spt_values ​​테이블을 사용하는 것입니다

WITH Contracts_CTE (contract_id, product_id, contract_day, amount) AS 
(
    SELECT 
     cl.contract_id, 
     cl.product_id, 
     DATEADD(DAY, v.number, cl.contract_line_start), 
     cl.amount/DATEDIFF(DAY, cl.contract_line_start, cl.contract_line_end) 
    FROM contracts_lines cl 
    CROSS JOIN master.dbo.spt_values v 
    WHERE v.type = 'P' 
    AND DATEADD(DAY, v.number, cl.contract_line_start) < cl.contract_line_end 
) 
SELECT 
    DATEPART(YEAR, c.contract_day) AS contract_year, 
    DATEPART(MONTH, c.contract_day) AS contract_month, 
    c.product_id, 
    c.contract_id, 
    SUM(Amount) AS contract_amount 
FROM Contracts_CTE c 
GROUP BY 
    c.product_id, 
    c.contract_id, 
    DATEPART(YEAR, c.contract_day), 
    DATEPART(MONTH, c.contract_day) 

주의 그냥 단어 - spt_values의 숫자는 2,047 0에서 이동 그래서 만약 당신이 약 5 년 이상 계약을 가지고 있다면, 당신은 더 긴 순서를 만들어야 할 것입니다. 이 작업을 수행하는 가장 쉬운 방법은, 그 자체로 spt_values ​​테이블을 가입 십자가에 예입니다 :

분명히
SELECT (v1.number * 2048) + v2.number 
FROM master.dbo.spt_values v1 
CROSS JOIN master.dbo.spt_values v2 
WHERE v1.type = 'P' 
AND v2.type = 'P' 
AND ((v1.number * 2048) + v2.number) < 100000 

위의 질의에 그 통합해야 할 것,하지만 정말 필요하다면 그때는 너무 열심히하지 않아야 .

+0

은 매력처럼 작동했습니다. 감사 – DrewM

0

을 감사하지만, 당신은 아마 30 일 월 말을 기준으로 각 프로젝트에 대한 월간 수익을 계산합니다. 이 같은

뭔가 :

먼저 각 계약/제품에 대한 날짜의 시퀀스를 생성하고 그룹 순서를 사용하기 만하면 무엇
select contract_id, product_id, 
     amount/(datediff(day, contract_line_start, contract_line_end)) * 30 as MontlyRevenue 
from contracts_lines 
+0

이것은 부분 개월 (중반 시작 또는 완료)을 다루지 않습니다. 또한 28,29, 또는 31 일간의 거래는하지 않습니다 (덜 중요하지만) – DrewM

관련 문제