문제

다음 데이터가있는 테이블이 있습니다.

Fiscal Year | Fiscal Quarter | Fiscal Week | Data
2009        | 2              | 22          | 9.5
2009        | 2              | 24          | 8.8
2009        | 2              | 26          | 8.8
2009        | 3              | 28          | 8.8
2009        | 3              | 31          | 9.1
2009        | 3              | 33          | 8.8

다음을 생성하는 쿼리를 작성하고 싶습니다.

Fiscal Year | Fiscal Quarter | Fiscal Week | Data | Trend
2009        | 2              | 22          | 9.5  | NULL
2009        | 2              | 24          | 8.8  | -0.7
2009        | 2              | 26          | 8.8  | 0
2009        | 3              | 28          | 8.8  | 0
2009        | 3              | 31          | 9.1  | 0.3
2009        | 3              | 33          | 8.8  | -0.3 

나는 이것이 이전 회계 주와 함께 테이블을 간단하게 조인함으로써 쉽게 달성 할 수 있다는 것을 알고 있지만, 이것은 항상 간단한 것은 아닙니다. t1.[Fiscal Week] = t2.[Fiscal Week] - 2 때로는 차이가 3 주이기 때문입니다.

다음과 같은 것으로 Max 레코드를 쉽게 가져올 수 있습니다.

SELECT
    MAX(t1.[Fiscal Week]) "LastWeek"
FROM t1
WHERE t1.[Fiscal Year] = 2009
    AND t1.[Fiscal Week] < 31

그러나 나는 가입이 작동하기 위해 그것을 추상화 할 때 손실을 입었습니다.

"현재 기록보다 작은 최대 회계 주간"에 대해 어떻게 자체 가입을 할 수 있습니까?

도움이 되었습니까?

해결책

SQL 2005+ 에서이 작업을 수행하는 가장 쉬운 방법은 순위 및 윈도우 기능 - 단순히 데이터를 분할/주문하고 각 레코드에 적절한 시퀀스를 할당합니다 (이 경우 FISCALYEAR로 분할하고 해당 창 위의 FISCALWEEK에 의해 주문 중) - 다음과 같은 보입니다.

with data as
(
    select  row_number() over (partition by a.fiscalYear order by a.fiscalWeek) as rn,
            a.fiscalYear, a.fiscalQuarter, a.fiscalWeek, a.Data
    from    #TableName a
)
select  a.fiscalYear, a.fiscalQuarter, a.fiscalWeek, a.Data, 
        a.Data - b.Data as Trend
from    data a
left join data b
on      a.fiscalYear = b.fiscalYear
and     a.rn = b.rn + 1
order by a.fiscalYear, a.rn

이 특정 쿼리는 FISCALYEAR 경계를 가로 지르는 확장을 허용하지 않습니다.이 올해 경계를 넘어 확장하려면 "절연"파티션을 "조항 및"FISCALYEAR "조정 조건으로 삭제하고 대신 FISCALYEAR의 조합으로 세트를 주문하려고합니다. 그리고 Fiscalweek, 다음과 같은 것 :

with data as
(
    select  row_number() over (order by a.fiscalYear + a.fiscalWeek) as rn,
            a.fiscalYear, a.fiscalQuarter, a.fiscalWeek, a.Data
    from    #TableName a
)
select  a.fiscalYear, a.fiscalQuarter, a.fiscalWeek, a.Data, 
        a.Data - b.Data as Trend
from    data a
left join data b
on      a.rn = b.rn + 1
order by a.rn

다른 팁

이것이 작동합니까? 인라인 쿼리는 약간의 입이 많고 아마도 더 나은 방법이있을 것입니다 ...

select
  [fiscal year]
, [fiscal quarter]
, [fiscal week]
, [data] 
, (
    select top 1 (i.data - t1.data) from t1 as i
    where i.[fiscal year] >= t1.[fiscal year]
    and i.[fiscal quarter] >= t1.[fiscal quarter]
    and i.[fiscal week] >= t1.[fiscal week]
    and (
          i.[fiscal year] <> t1.[fiscal year]
       or i.[fiscal quarter] <> t1.[fiscal quarter]
       or i.[fiscal week] <> t1.[fiscal week]
    )
    order by [fiscal year] asc, [fiscal quarter] asc, [fiscal week] asc
) as trend
from t1

SQL Server 2005를 사용하는 경우 사용할 수 있습니다. CROSS APPLY 절.

여기에는 테이블 값 기능이있을 수 있으며,이 기능은 현재 행에있는 회계 주에 행을 반환합니다.

CREATE FUNCTION dbo.fn_GetFiscalWeekBeforeThis(@Year AS int, 
  @CurrentWeek as int)
  RETURNS TABLE
AS
RETURN
  SELECT TOP 1 *
  FROM t1
  WHERE [Fiscal Year] = @Year 
  AND [Fiscal Week] < @CurrentWeek
  ORDER BY [Fiscal Week] DESC
GO

그리고,

SELECT A.*,
A.Data - B.Data
FROM
t1 A
CROSS APPLY 
   dbo.fn_GetFiscalWeekBeforeThis(A.[Fiscal Year],  
   A.[Fiscal Week]) AS B

편집 : 기사를보고 IDE없이 SQL을 조정했습니다.
또한, 나는 그것이 첫 번째 행에서 어떻게 작동하는지 모른다.

그러니 친절하십시오 :)

edit2 : 전혀 작동하지 않는다면 알려주세요.
이것은 결과를 확인하지 않고 물건에 대답하지 않는 데 도움이 될 것입니다.

edit3 : 함수에서 쿼터 매개 변수가 필요하지 않았습니다.

DECLARE @Fiscal TABLE
  ( 
   FiscalYear int
  ,FiscalQuarter int
  ,FiscalWeek int
  ,[Data] decimal(4,1) 
  )

INSERT INTO @Fiscal
          ( FiscalYear, FiscalQuarter, FiscalWeek, [Data] )
SELECT 2009, 2, 22, 9.5 UNION
SELECT 2009, 2, 24, 8.8 UNION
SELECT 2009, 2, 26, 8.8 UNION
SELECT 2009, 3, 28, 8.8 UNION
SELECT 2009, 3, 31, 9.1 UNION
SELECT 2009, 3, 33, 8.8 UNION
SELECT 2010, 1, 1, 9.0 UNION
SELECT 2010, 1, 2, 9.2

;
WITH  abcd
        AS ( SELECT FiscalYear
                   ,FiscalQuarter
                   ,FiscalWeek
                   ,[Data]
                   ,row_number() OVER ( ORDER BY FiscalYear, FiscalWeek ) AS rn
             FROM   @Fiscal
           )
  SELECT  a.FiscalYear
         ,a.FiscalQuarter
         ,a.FiscalWeek
         ,a.[Data]
         ,a.[Data] - b.[Data] AS [Trend]
  FROM    abcd AS a
          LEFT JOIN abcd AS b ON b.rn = ( a.rn - 1 )
  ORDER BY a.FiscalYear
         ,a.FiscalWeek
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top