2013-01-02 1 views
-1

는 I는 [Week][Year]과 열을 사용하여 화학식 2로 계산되며 계산 열 [StartTime][EndTime]디자인의 계산 열이 SQL Server에서 다른 열을 참조 할 수 있습니까?

[StartTime][EndTime]있다.

이제 첫 번째 두 개를 사용하여 계산 된 다른 계산 된 열 [Status]이 필요합니다. 하지만 수식에 오류가 발생합니다. [Status]

정말 대안이 없기 때문에이 기능이 필요합니다. 그러나 이것도 가능합니까? 여기

당신이 미스터 -1 이동 :

(case when [IsVOR]=(1) then 'VOR' 
     when [MarkedAsCompleteOn] IS NULL AND [Year]<datepart(year,getdate()) then 'Overdue' 
     when [MarkedAsCompleteOn] IS NULL AND [Year]>datepart(year,getdate()) then 'Not Due' 
     when [MarkedAsCompleteOn] IS NULL AND [Year]=datepart(year,getdate()) AND [Week]<datepart(iso_week,getdate()) then 'Overdue' 
     when [MarkedAsCompleteOn] IS NULL AND [Year]=datepart(year,getdate()) AND [Week]=datepart(iso_week,getdate()) then 'Due' 
     when [MarkedAsCompleteOn] IS NULL AND [Year]=datepart(year,getdate()) AND [Week]>datepart(iso_week,getdate()) then 'Not Due' 
     when [MarkedAsCompleteOn] IS NOT NULL AND [Year]<datepart(year,[MarkedAsCompleteOn]) then 'Late' 
     when [MarkedAsCompleteOn] IS NOT NULL AND [Year]>datepart(year,[MarkedAsCompleteOn]) then 'Early' 
     when [MarkedAsCompleteOn] IS NOT NULL AND [Year]=datepart(year,[MarkedAsCompleteOn]) AND [Week]<datepart(iso_week,[MarkedAsCompleteOn]) then 'Late' 
     when [MarkedAsCompleteOn] IS NOT NULL AND [Year]=datepart(year,[MarkedAsCompleteOn]) AND [Week]=datepart(iso_week,[MarkedAsCompleteOn]) then 'On Time' 
     when [MarkedAsCompleteOn] IS NOT NULL AND [MarkedAsCompleteOn]<[AllocatedTimeStart] then 'Early' end) 

그것의 마지막 부분은 오류가 발생합니다

[MarkedAsCompleteOn]<[AllocatedTimeStart] then 'Early' 

을 그리고 오류가 제네릭 :

- Error validating the formula for column 'Status'. 
+0

-1 (쿼리 및 오류 게시 용) – Oded

+0

어쩌면 이상적이 아니지만 항상 주와 연도 열을 기준으로 상태를 계산할 수 있습니다. 복사 - 파스타 ... 예, 가능합니다 ... – rene

+0

@rene 그게 제가 현재하고 있지만 그 원인을 일으키는 문제입니다 정확도. 예를 들어 Dec의 31st가 주 53으로 표시되는 것처럼 제한하는 데 날짜 만 사용할 수 있다면 더 쉬울 것입니다. – sprocket12

답변

0

결국 내 자신의 솔루션을 찾았습니다. function을 사용하여 내 프로덕션 앱을 변경하지 않고 보관했습니다. 이 sql server에서 이제까지 function 처음이므로 최적하지 않을 수 있습니다

([dbo].[GetStatus]([MarkedAsCompleteOn],[Year],[Week])) 

:

USE [DBNAME] 
GO 
/****** Object: UserDefinedFunction [dbo].[GetStatus] Script Date: 01/02/2013 11:08:29 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[GetStatus](@CompletedOn DATETIME, @Year INT, @Week INT) 
RETURNS NVARCHAR(MAX) 
AS BEGIN 
    DECLARE @CurrentDate DATETIME 
    DECLARE @StartTime DATETIME 
    DECLARE @EndTime DATETIME 
    DECLARE @Status NVARCHAR(MAX) 

    SET @CurrentDate = GETDATE() 
    SET @StartTime = (dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT([varchar](4),@Year,(0))+'-01-01'),(1))))) 
    SET @EndTime = (dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT([varchar](4),@Year,(0))+'-01-01'),(8))))) 

    SET @Status = '-' 
    IF(@CompletedOn IS NULL) 
     BEGIN 
      IF(@CurrentDate < @StartTime) 
       SET @Status = 'Not Due' 
      IF(@CurrentDate > @StartTime AND @CurrentDate < @EndTime) 
       SET @Status = 'Due' 
      IF(@CurrentDate > @EndTime) 
       SET @Status = 'Overdue' 
     END 
    ELSE 
     BEGIN 
      IF(@CompletedOn < @StartTime) 
       SET @Status = 'Early' 
      IF(@CompletedOn > @EndTime) 
       SET @Status = 'Late' 
      ELSE 
       SET @Status = 'On Time' 
     END 

    RETURN @Status 
END 

그리고 status 분야에서

나는 공식을 넣어.

0

번호 하나 계산 된 열은 다른 계산 된 열을 기반으로 할 수 없습니다. 이 (1759)에 대한 특정 오류가 있습니다.

'% s'테이블의 계산 된 열 '% s'을 (를) 다른 계산 열 정의에서 사용할 수 없습니다.

당신은 테이블을 기반으로하는 보기를 작성하고 뷰 정의 내에서 계산의 두 번째 라운드를 수행 할 수 있습니다. 그런 다음보기에 대해 모든 활동을 수행하는지 (필요한 경우 트리거 추가) 또는 조회를 위해서만 사용하면 디자인 의사 결정이 필요합니다.

물론 뷰를 사용한다는 생각을 추가하면 공통 테이블 식을 사용하여 계산 계층을 여러 개 만들 수 있습니다.

보기가 인덱싱 된 뷰가되기에 적합하지 않으면 계산 된 열을 유지할 수 없습니다.이 경우 중요하지 않습니다. 날짜 계산에 기반한 것으로 보이므로 어쨌든 지속되지 않을 수 있습니다. .

+0

불행히도 나는이 테이블을 [상태] 작업에 의존하는 프로덕션 환경의 앱을 보유하고 있습니다. 현재로서는 부정확 한 결과가 나오므로 적절한 수정이 필요합니다. 나는 함수를 실험하고 있으므로 잘하면 잘 될 것이다. 계산 된 필드의 수식에 변수를 선언 할 수 있습니까? – sprocket12

+0

@MuhammadA - 테이블의 이름을 바꿀 수 * 다음 테이블의 원래 이름을 사용하여보기를 만듭니다. 뷰가 업데이트 가능하다면 (또는 필요할 경우 필요한 트리거를 생성하는 경우), 원래 애플리케이션은이 변경을 무식하게 알고 있어야합니다. 그것은 내가보기에 대해 모든 활동을 수행한다고 말했을 때 내가 모호하게 언급 한 것입니다. (데이터베이스 오브젝트에 헝가리 식 접두어를 사용하는 사람들이 싫어하는 이유 중 하나이기도합니다. 테이블이나 뷰에 대해 작업하고 있는지 여부를 * 알지 못하거나 신경써서는 안됩니다.) –

+0

제안 해 주신 데미안 ,하지만 내 솔루션이 작동하고 순간에 나는 "그것이 깨지지 않았 으면 고칠 수 없다"고 느낀다. – sprocket12